/ Hex Artifact Content
Login

Artifact 5c2b49c37db966bc312ff28d296767961fb894c3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 31  : pager.c,v 1.51
0350: 39 20 32 30 30 38 2f 31 32 2f 32 30 20 30 38 3a  9 2008/12/20 08:
0360: 33 39 3a 35 37 20 64 61 6e 69 65 6c 6b 31 39 37  39:57 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 41 6e 20 65 72          /* An er
1c500 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
1c510 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
1c520 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1c530 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
1c540 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
1c550 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20   rolled back by 
1c560 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e  the layer above.
1c570 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1c580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c5a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c5b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1c5c0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
1c5d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c5e0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
1c5f0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
1c600 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
1c610 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
1c620 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
1c630 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
1c640 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
1c650 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
1c660 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
1c670 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
1c680 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
1c690 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
1c6a0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
1c6b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pgno);.      }el
1c6c0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1c6d0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1c6e0 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
1c6f0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
1c700 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
1c710 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
1c720 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d  _SYNC;.        }
1c730 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
1c740 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20  ACE4("APPEND %d 
1c750 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
1c760 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1c770 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1c780 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1c790 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1c7a0 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
1c7b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
1c7c0 3f 31 3a 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ?1:0));.      }.
1c7d0 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66        if( pPg->f
1c7e0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1c7f0 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
1c800 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1c810 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1c820 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
1c830 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1c840 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
1c850 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
1c860 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
1c870 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
1c880 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
1c890 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1c8a0 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
1c8b0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
1c8c0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
1c8d0 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
1c8e0 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
1c8f0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
1c900 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
1c910 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
1c920 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
1c930 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
1c940 69 66 28 20 21 70 61 67 65 49 6e 53 61 76 65 70  if( !pageInSavep
1c950 6f 69 6e 74 28 70 50 67 29 20 29 7b 0a 20 20 20  oint(pPg) ){.   
1c960 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1c970 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1c980 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
1c990 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61  Size);.      cha
1c9a0 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45  r *pData2 = CODE
1c9b0 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1c9c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
1c9d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c9e0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
1c9f0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
1ca00 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1ca10 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  e );.      rc = 
1ca20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
1ca30 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
1ca40 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1ca50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ca60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ca70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1ca80 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  rite(pPager->sjf
1ca90 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
1caa0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
1cab0 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a  set+4);.      }.
1cac0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1cad0 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
1cae0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1caf0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1cb00 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1cb10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cb20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1cb30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1cb40 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1cb50 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
1cb60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cb70 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
1cb80 3b 0a 20 20 20 20 20 20 61 64 64 54 6f 53 61 76  ;.      addToSav
1cb90 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
1cba0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
1cbb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1cbc0 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
1cbd0 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
1cbe0 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
1cbf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1cc00 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1cc10 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
1cc20 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70  r->dbSize<pPg->p
1cc30 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
1cc40 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
1cc50 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70  >pgno;.    if( p
1cc60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
1cc70 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1cc80 61 67 65 72 29 2d 31 29 20 29 7b 0a 20 20 20 20  ager)-1) ){.    
1cc90 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1cca0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1ccb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ccc0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ccd0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72  n is used to mar
1cce0 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61 73  k a data-page as
1ccf0 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73   writable. It us
1cd00 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69  es .** pager_wri
1cd10 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a  te() to open a j
1cd20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
1cd30 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1cd40 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77  y open).** and w
1cd50 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a 70  rite the page *p
1cd60 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72  Data to the jour
1cd70 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  nal..**.** The d
1cd80 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1cd90 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1cda0 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
1cdb0 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
1cdc0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
1cdd0 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
1cde0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
1cdf0 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
1ce00 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
1ce10 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
1ce20 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
1ce30 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
1ce40 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
1ce50 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
1ce60 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1ce70 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
1ce80 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
1ce90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
1cea0 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
1ceb0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cec0 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
1ced0 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
1cee0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1cef0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1cf00 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
1cf10 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
1cf20 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
1cf30 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
1cf40 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74  if( nPagePerSect
1cf50 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
1cf60 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
1cf70 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1cf80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1cf90 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1cfa0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfc0 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
1cfd0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
1cfe0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
1cff0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
1d000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d010 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1d020 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
1d030 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
1d040 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
1d050 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
1d060 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   0;..    /* Set 
1d070 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
1d080 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
1d090 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
1d0a0 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
1d0b0 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
1d0c0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
1d0d0 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
1d0e0 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
1d0f0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
1d100 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1d110 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
1d120 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
1d130 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
1d140 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
1d150 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
1d160 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
1d170 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
1d180 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
1d190 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
1d1a0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
1d1b0 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
1d1c0 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
1d1d0 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
1d1e0 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
1d1f0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1d200 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
1d210 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
1d220 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
1d230 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
1d240 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
1d250 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
1d260 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1d270 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
1d280 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
1d290 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
1d2a0 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
1d2b0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1d2c0 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
1d2d0 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
1d2e0 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
1d2f0 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
1d300 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1d310 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
1d320 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
1d330 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
1d340 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
1d350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1d360 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
1d370 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
1d380 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
1d390 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
1d3a0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
1d3b0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
1d3c0 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
1d3d0 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
1d3e0 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
1d3f0 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
1d400 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
1d410 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
1d420 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
1d430 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
1d440 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
1d450 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
1d460 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
1d470 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1d480 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d490 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1d4a0 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
1d4b0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1d4c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d4d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1d4e0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1d4f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1d500 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
1d510 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1d520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1d530 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
1d540 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1d550 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d560 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
1d570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1d580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d590 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
1d5a0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1d5b0 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
1d5c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1d5d0 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
1d5e0 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
1d5f0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
1d600 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
1d610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1d620 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1d630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d640 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
1d650 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
1d660 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
1d670 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
1d680 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
1d690 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
1d6a0 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
1d6b0 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
1d6c0 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
1d6d0 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
1d6e0 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
1d6f0 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
1d700 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
1d710 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
1d720 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
1d730 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
1d740 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
1d750 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
1d760 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
1d770 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
1d780 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1d790 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
1d7a0 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
1d7b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1d7c0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1d7d0 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
1d7e0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1d7f0 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64  ii<nPage && need
1d800 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Sync; ii++){.   
1d810 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
1d820 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
1d830 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
1d840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1d850 61 67 65 20 29 20 70 50 61 67 65 2d 3e 66 6c 61  age ) pPage->fla
1d860 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
1d870 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 73  _SYNC;.        s
1d880 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d890 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
1d8a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
1d8b0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
1d8c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
1d8d0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
1d8e0 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
1d8f0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1d900 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
1d910 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1d920 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
1d930 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d940 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1d950 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
1d960 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1d970 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
1d980 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
1d990 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
1d9a0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
1d9b0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
1d9c0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
1d9d0 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
1d9e0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1d9f0 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
1da00 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
1da10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1da20 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
1da30 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
1da40 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1da50 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
1da60 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1da70 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1da80 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1da90 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1daa0 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
1dab0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1dac0 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
1dad0 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
1dae0 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
1daf0 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
1db00 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1db10 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
1db20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
1db30 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
1db40 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
1db50 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
1db60 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
1db70 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
1db80 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
1db90 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
1dba0 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
1dbb0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
1dbc0 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
1dbd0 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
1dbe0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1dbf0 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
1dc00 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
1dc10 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
1dc20 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
1dc30 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
1dc40 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1dc50 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
1dc60 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1dc70 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
1dc80 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
1dc90 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1dca0 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
1dcb0 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
1dcc0 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
1dcd0 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
1dce0 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
1dcf0 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
1dd00 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
1dd10 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1dd20 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1dd30 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
1dd40 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
1dd50 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
1dd60 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
1dd70 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1dd80 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
1dd90 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
1dda0 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
1ddb0 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
1ddc0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
1ddd0 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
1dde0 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
1ddf0 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
1de00 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1de10 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
1de20 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
1de30 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
1de40 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
1de50 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
1de60 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
1de70 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
1de80 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
1de90 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1dea0 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
1deb0 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
1dec0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1ded0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1dee0 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
1def0 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73  reused,.** the s
1df00 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1df10 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1df20 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1df30 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  t because the.**
1df40 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63   page contains c
1df50 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1df60 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1df70 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a  e sure it gets.*
1df80 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  * rolled back in
1df90 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71   spite of the sq
1dfa0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1dfb0 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
1dfc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1dfd0 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
1dfe0 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
1dff0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1e000 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1e010 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1e020 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
1e030 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1e040 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1e050 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
1e060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1e070 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
1e080 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3d 3d 30  lwaysRollback==0
1e090 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e0a0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1e0b0 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
1e0c0 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
1e0d0 6b 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  k = sqlite3Bitve
1e0e0 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
1e0f0 6f 72 69 67 44 62 53 69 7a 65 29 3b 0a 20 20 20  origDbSize);.   
1e100 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 41   if( !pPager->pA
1e110 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
1e120 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e130 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1e140 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  }.  }.  rc = sql
1e150 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
1e160 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
1e170 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f  lback, pPg->pgno
1e180 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1e190 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 67 2d  LITE_OK && (pPg-
1e1a0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1e1b0 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  TY) && pPager->n
1e1c0 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a  Savepoint==0 ){.
1e1d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e1e0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1e1f0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1e200 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1e210 65 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  e==pPg->pgno && 
1e220 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1e230 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
1e240 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
1e250 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
1e260 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1e270 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
1e280 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
1e290 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
1e2a0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1e2b0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
1e2c0 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
1e2d0 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
1e2e0 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
1e2f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
1e300 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
1e310 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
1e320 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
1e330 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
1e340 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
1e350 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
1e360 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
1e370 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
1e380 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
1e390 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
1e3a0 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
1e3b0 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
1e3c0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
1e3d0 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
1e3e0 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
1e3f0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
1e400 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
1e410 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
1e420 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
1e430 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1e440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e450 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
1e460 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
1e470 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
1e480 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1e490 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
1e4a0 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
1e4b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1e4c0 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20  Pg->pgno)).     
1e4d0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
1e4e0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b  GHDR_DONT_WRITE;
1e4f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1e500 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
1e510 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
1e520 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1e530 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
1e540 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e550 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  rc;.}../*.** A c
1e560 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1e570 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1e580 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
1e590 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
1e5a0 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
1e5b0 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
1e5c0 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
1e5d0 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
1e5e0 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
1e5f0 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
1e600 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
1e610 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
1e620 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
1e630 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1e640 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e  .** If we have n
1e650 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79 20  ot yet actually 
1e660 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
1e670 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28 69   of this page (i
1e680 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e 6e  f.** the PgHdr.n
1e690 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73 20  eedRead flag is 
1e6a0 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20 72  set) then this r
1e6b0 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61  outine acts as a
1e6c0 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74   promise.** that
1e6d0 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e   we will never n
1e6e0 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20  eed to read the 
1e6f0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20  page content in 
1e700 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73  the future..** s
1e710 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20 66  o the needRead f
1e720 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61 72  lag can be clear
1e730 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1e740 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e750 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1e760 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ck(DbPage *pPg){
1e770 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1e780 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1e790 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e7a0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1e7b0 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f  RESERVED );..  /
1e7c0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1e7d0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
1e7e0 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69 74 65 28  n, or DontWrite(
1e7f0 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
1e800 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69 73 20 70  d on.  ** this p
1e810 61 67 65 20 28 44 6f 6e 74 57 72 69 74 65 28 29  age (DontWrite()
1e820 20 73 65 74 73 20 74 68 65 20 61 6c 77 61 79 73   sets the always
1e830 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 29 2c 20  Rollback flag), 
1e840 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 66  then this.  ** f
1e850 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1e860 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1e870 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1e880 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c  en==0 .   || sql
1e890 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
1e8a0 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
1e8b0 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70 67 6e  llback, pPg->pgn
1e8c0 6f 29 0a 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67  o).   || pPg->pg
1e8d0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
1e8e0 62 53 69 7a 65 0a 20 20 29 7b 0a 20 20 20 20 72  bSize.  ){.    r
1e8f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 23 69 66 64  eturn;.  }..#ifd
1e900 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
1e910 5f 44 45 4c 45 54 45 0a 20 20 69 66 28 20 73 71  _DELETE.  if( sq
1e920 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
1e930 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1e940 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 21 3d  al, pPg->pgno)!=
1e950 30 0a 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  0.   || pPg->pgn
1e960 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1e970 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
1e980 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
1e990 20 20 2f 2a 20 49 66 20 53 45 43 55 52 45 5f 44    /* If SECURE_D
1e9a0 45 4c 45 54 45 20 69 73 20 64 69 73 61 62 6c 65  ELETE is disable
1e9b0 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
1e9c0 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 69   no way that thi
1e9d0 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 63  s.  ** routine c
1e9e0 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  an be called on 
1e9f0 61 20 70 61 67 65 20 66 6f 72 20 77 68 69 63 68  a page for which
1ea00 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1ea10 74 57 72 69 74 65 28 29 0a 20 20 2a 2a 20 68 61  tWrite().  ** ha
1ea20 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69  s not been previ
1ea30 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 64 75 72  ously called dur
1ea40 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74 72 61  ing the same tra
1ea50 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  nsaction..  ** A
1ea60 6e 64 20 69 66 20 44 6f 6e 74 57 72 69 74 65 28  nd if DontWrite(
1ea70 29 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) has previously
1ea80 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
1ea90 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
1eaa0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
1eab0 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2a 0a 20 20   be met..  **.  
1eac0 2a 2a 20 28 4c 61 74 65 72 3a 29 20 20 4e 6f 74  ** (Later:)  Not
1ead0 20 74 72 75 65 2e 20 20 49 66 20 74 68 65 20 64   true.  If the d
1eae0 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
1eaf0 70 74 65 64 20 62 79 20 68 61 76 69 6e 67 20 64  pted by having d
1eb00 75 70 6c 69 63 61 74 65 0a 20 20 2a 2a 20 70 61  uplicate.  ** pa
1eb10 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1eb20 69 73 74 20 28 65 78 3a 20 63 6f 72 72 75 70 74  ist (ex: corrupt
1eb30 39 2e 74 65 73 74 29 20 74 68 65 6e 20 74 68 65  9.test) then the
1eb40 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 6f   following is no
1eb50 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69  t.  ** necessari
1eb60 6c 79 20 74 72 75 65 3a 0a 20 20 2a 2f 0a 20 20  ly true:.  */.  
1eb70 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  /* assert( !pPg-
1eb80 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
1eb90 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
1eba0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1ebb0 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20 61 73 73 65  ze ); */..  asse
1ebc0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
1ebd0 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73  ournal!=0 );.  s
1ebe0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
1ebf0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1ec00 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
1ec10 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
1ec20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
1ec30 3b 0a 20 20 61 64 64 54 6f 53 61 76 65 70 6f 69  ;.  addToSavepoi
1ec40 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
1ec50 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1ec60 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
1ec70 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
1ec80 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
1ec90 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1eca0 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
1ecb0 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25 70  ACE(("GARBAGE %p
1ecc0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1ecd0 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 7d 0a 0a 0a  pPg->pgno)).}...
1ece0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1ecf0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1ed00 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1ed10 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1ed20 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1ed30 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1ed40 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1ed50 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1ed60 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1ed70 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1ed80 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
1ed90 44 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72  Direct){.  PgHdr
1eda0 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20   *pPgHdr;.  u32 
1edb0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1edc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1edd0 45 5f 4f 4b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  E_OK;..#ifndef S
1ede0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
1edf0 4d 49 43 5f 57 52 49 54 45 0a 20 20 61 73 73 65  MIC_WRITE.  asse
1ee00 72 74 28 20 69 73 44 69 72 65 63 74 3d 3d 30 20  rt( isDirect==0 
1ee10 29 3b 20 20 2f 2a 20 69 73 44 69 72 65 63 74 20  );  /* isDirect 
1ee20 69 73 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72  is only true for
1ee30 20 61 74 6f 6d 69 63 20 77 72 69 74 65 73 20 2a   atomic writes *
1ee40 2f 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  /.#endif.  if( !
1ee50 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1ee60 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65  untDone && pPage
1ee70 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
1ee80 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1ee90 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1eea0 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1eeb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1eec0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
1eed0 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
1eee0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1eef0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
1ef00 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65 63      if( !isDirec
1ef10 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
1ef20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ef30 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20  e(pPgHdr);.     
1ef40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ef50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1ef60 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1ef70 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20  pPgHdr);.       
1ef80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ef90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1efa0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1efb0 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1efc0 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1efd0 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1efe0 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
1eff0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1f000 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65  4byte((u8*)pPage
1f010 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a  r->dbFileVers);.
1f020 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1f030 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62  er++;.    put32b
1f040 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
1f050 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  dr->pData)+24, c
1f060 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1f070 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f080 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
1f090 54 45 0a 20 20 20 20 69 66 28 20 69 73 44 69 72  TE.    if( isDir
1f0a0 65 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66  ect && pPager->f
1f0b0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1f0c0 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
1f0d0 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e  *zBuf = pPgHdr->
1f0e0 70 44 61 74 61 3b 0a 20 20 20 20 20 20 72 63 20  pData;.      rc 
1f0f0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1f100 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
1f110 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
1f120 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  ize, 0);.    }.#
1f130 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
1f140 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
1f150 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
1f160 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1f170 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
1f180 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1f190 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d  untDone = 1;.  }
1f1a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f1b0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1f1c0 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
1f1d0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
1f1e0 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
1f1f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1f200 74 20 72 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44  t rc;.  if( MEMD
1f210 42 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  B ){.    rc = SQ
1f220 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
1f230 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1f240 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1f250 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
1f260 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
1f270 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f280 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
1f290 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1f2a0 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
1f2b0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1f2c0 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
1f2d0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1f2e0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1f2f0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1f300 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
1f310 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
1f320 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
1f330 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
1f340 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1f350 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
1f360 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
1f370 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1f380 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
1f390 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
1f3a0 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1f3b0 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
1f3c0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
1f3d0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
1f3e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1f3f0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
1f400 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
1f410 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
1f420 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
1f430 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1f440 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
1f450 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
1f460 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
1f470 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1f480 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
1f490 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
1f4a0 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
1f4b0 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
1f4c0 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
1f4d0 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
1f4e0 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
1f4f0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1f500 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
1f510 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1f520 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1f530 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1f540 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1f550 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1f560 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1f570 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1f580 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1f590 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61  *.** If the fina
1f5a0 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f  l parameter - no
1f5b0 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20  Sync - is true, 
1f5c0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
1f5d0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a  e file itself.**
1f5e0 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20   is not synced. 
1f5f0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1f600 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
1f610 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79  rSync() directly
1f620 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20   to.** sync the 
1f630 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
1f640 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d  fore calling Com
1f650 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f  mitPhaseTwo() to
1f660 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a   delete the.** j
1f670 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
1f680 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74  his case..*/.int
1f690 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1f6a0 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50  mitPhaseOne(.  P
1f6b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
1f6c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1f6d0 73 74 65 72 2c 20 0a 20 20 50 67 6e 6f 20 6e 54  ster, .  Pgno nT
1f6e0 72 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 6f 53 79  runc,.  int noSy
1f6f0 6e 63 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  nc.){.  int rc =
1f700 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1f710 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1f720 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
1f730 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1f740 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
1f750 6f 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  o changes have b
1f760 65 65 6e 20 6d 61 64 65 2c 20 77 65 20 63 61 6e  een made, we can
1f770 20 6c 65 61 76 65 20 74 68 65 20 74 72 61 6e 73   leave the trans
1f780 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20  action early..  
1f790 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1f7a0 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
1f7b0 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  &.        (pPage
1f7c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
1f7d0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1f7e0 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20  E_DELETE ||.    
1f7f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78        pPager->ex
1f800 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20  clusiveMode!=0) 
1f810 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1f820 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1f830 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
1f840 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
1f850 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1f860 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
1f870 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
1f880 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
1f890 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
1f8a0 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
1f8b0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
1f8c0 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
1f8d0 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  Trunc);..  /* If
1f8e0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1f8f0 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
1f900 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
1f910 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
1f920 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1f930 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1f940 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
1f950 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1f960 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1f970 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
1f980 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
1f990 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1f9a0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1f9b0 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
1f9c0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1f9d0 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68  _WRITE.    /* Th
1f9e0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
1f9f0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
1fa00 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f  be used if all o
1fa10 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  f the.    ** fol
1fa20 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1fa30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fa40 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73    + The file-sys
1fa50 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
1fa60 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
1fa70 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
1fa80 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
1fa90 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
1faa0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
1fab0 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
1fac0 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
1fad0 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
1fae0 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
1faf0 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e      + Exactly on
1fb00 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
1fb10 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
1fb20 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
1fb30 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
1fb40 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
1fb50 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
1fb60 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20   used, then the 
1fb70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
1fb80 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62  l never.    ** b
1fb90 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  e created for th
1fba0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
1fbb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75      */.    int u
1fbc0 73 65 41 74 6f 6d 69 63 57 72 69 74 65 3b 0a 20  seAtomicWrite;. 
1fbd0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1fbe0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1fbf0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1fc00 3b 0a 20 20 20 20 75 73 65 41 74 6f 6d 69 63 57  ;.    useAtomicW
1fc10 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  rite = (.       
1fc20 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20   !zMaster && .  
1fc30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1fc40 75 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20 20 20  urnalOpen &&.   
1fc50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1fc60 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
1fc70 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
1fc80 26 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75  && .        nTru
1fc90 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20  nc==0 && .      
1fca0 20 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67    (pPg==0 || pPg
1fcb0 2d 3e 70 44 69 72 74 79 3d 3d 30 29 0a 20 20 20  ->pDirty==0).   
1fcc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1fcd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1fce0 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  pen || pPager->j
1fcf0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1fd00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
1fd10 46 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65  F );.    if( use
1fd20 41 74 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20  AtomicWrite ){. 
1fd30 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
1fd40 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
1fd50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1fd60 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
1fd70 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
1fd80 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
1fd90 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1fda0 69 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ic);.      asser
1fdb0 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  t(pPager->nRec==
1fdc0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
1fdd0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
1fde0 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  r->jfd, offset, 
1fdf0 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
1fe00 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1fe10 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e  the db file chan
1fe20 67 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20  ge counter. The 
1fe30 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77  following call w
1fe40 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20  ill modify.     
1fe50 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   ** the in-memor
1fe60 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
1fe70 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e   of page 1 to in
1fe80 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65  clude the update
1fe90 64 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67  d.      ** chang
1fea0 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
1feb0 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
1fec0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
1fed0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
1fee0 2a 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  * file. Because 
1fef0 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
1ff00 69 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20  ite property of 
1ff10 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
1ff20 73 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20  stem, .      ** 
1ff30 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
1ff40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1ff50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ff60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
1ff70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1ff80 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
1ff90 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1ffa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1ffb0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
1ffc0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
1ffd0 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fd);.    }..    
1ffe0 69 66 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72  if( !useAtomicWr
1fff0 69 74 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ite && rc==SQLIT
20000 45 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20  E_OK ).#endif.. 
20010 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65     /* If a maste
20020 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
20030 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
20040 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
20050 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
20060 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  al file, then no
20070 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
20080 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  d. This happens 
20090 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a  when it is.    *
200a0 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20  * written, then 
200b0 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c  the process fail
200c0 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  s to upgrade fro
200d0 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20  m a RESERVED to 
200e0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
200f0 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65  IVE lock. The ne
20100 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63  xt time the proc
20110 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d  ess tries to com
20120 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  mit the.    ** t
20130 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d  ransaction the m
20140 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76  -j name will hav
20150 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
20160 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
20170 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
20180 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  setMaster ){.   
20190 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
201a0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
201b0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
201c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
201d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
201e0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 69 66 28  _exit;.      if(
201f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20200 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
20210 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23  NALMODE_OFF ){.#
20220 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20230 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
20240 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63        if( nTrunc
20250 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
20260 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
20270 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
20280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
20290 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
202a0 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 20 20  pages.          
202b0 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
202c0 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
202d0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
202e0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
202f0 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nal.          **
20300 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
20310 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 50 67   */.          Pg
20320 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  no i;.          
20330 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47  Pgno iSkip = PAG
20340 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
20350 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  r);.          fo
20360 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69  r( i=nTrunc+1; i
20370 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
20380 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
20390 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
203a0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
203b0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
203c0 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b  al, i) && i!=iSk
203d0 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ip ){.          
203e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
203f0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
20400 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20   i, &pPg);.     
20410 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
20420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
20430 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
20440 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
20450 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20460 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
20470 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20480 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
20490 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
204a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
204b0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
204c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
204d0 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
204e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
204f0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
20500 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
20510 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
20520 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
20530 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
20540 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
20550 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
20560 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
20570 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
20580 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20590 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
205a0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
205b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
205c0 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63  M.    if( nTrunc
205d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
205e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
205f0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
20600 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  Trunc);.      if
20610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20620 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
20630 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
20640 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
20650 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
20660 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20670 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 73  e */.    pPg = s
20680 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
20690 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
206a0 43 61 63 68 65 29 3b 0a 20 20 20 20 72 63 20 3d  Cache);.    rc =
206b0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
206c0 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
206d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
206e0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
206f0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  t( rc!=SQLITE_IO
20700 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20  ERR_BLOCKED );. 
20710 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f       /* The erro
20720 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66  r might have lef
20730 74 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  t the dirty list
20740 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68   all fouled up h
20750 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75  ere,.      ** bu
20760 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  t that does not 
20770 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20 69  matter because i
20780 66 20 74 68 65 20 69 66 20 74 68 65 20 64 69 72  f the if the dir
20790 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20  ty list did.    
207a0 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74    ** get corrupt
207b0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61  ed, then the tra
207c0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f  nsaction will ro
207d0 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20  ll back and.    
207e0 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
207f0 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68   dirty list.  Th
20800 65 72 65 20 69 73 20 61 6e 20 61 73 73 65 72 74  ere is an assert
20810 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67   in.      ** pag
20820 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
20830 5f 70 61 67 65 73 28 29 20 74 68 61 74 20 76 65  _pages() that ve
20840 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61  rifies that no a
20850 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20  ttempt.      ** 
20860 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61  is made to use a
20870 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20  n invalid dirty 
20880 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  list..      */. 
20890 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65       goto sync_e
208a0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xit;.    }.    s
208b0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
208c0 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
208d0 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  ache);..    /* S
208e0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
208f0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
20900 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
20910 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a  c && !noSync ){.
20920 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20930 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
20940 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
20950 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
20960 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
20970 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
20980 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
20990 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
209a0 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SYNCED;.  }else 
209b0 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72  if( MEMDB && nTr
209c0 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  unc!=0 ){.    rc
209d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
209e0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
209f0 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79  nTrunc);.  }..sy
20a00 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72  nc_exit:.  if( r
20a10 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
20a20 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f  BLOCKED ){.    /
20a30 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
20a40 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79  ngecounter() may
20a50 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
20a60 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  in an exclusive.
20a70 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73       * lock to s
20a80 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61  pill the cache a
20a90 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f  nd return IOERR_
20aa0 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e  BLOCKED. But sin
20ab0 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65  ce .     * there
20ac0 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
20ad0 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e  e cache is incon
20ae0 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20  sistent, it is. 
20af0 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20      * better to 
20b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
20b10 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  SY..     */.    
20b20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
20b30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20b40 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
20b50 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
20b60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
20b70 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
20b80 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
20b90 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
20ba0 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
20bb0 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
20bc0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
20bd0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
20be0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
20bf0 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
20c00 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
20c10 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
20c20 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
20c30 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
20c40 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
20c50 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
20c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
20c70 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
20c80 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
20c90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20ca0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
20cb0 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
20cc0 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
20cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
20ce0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
20cf0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
20d00 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  d==0 &&.        
20d10 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
20d20 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
20d30 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c  NALMODE_DELETE |
20d40 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  |.          pPag
20d50 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
20d60 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73  e!=0) ){.    ass
20d70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
20d80 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
20d90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
20da0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  n==0 );.    retu
20db0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
20dc0 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  }.  PAGERTRACE2(
20dd0 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
20de0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
20df0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20e00 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
20e10 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20  SYNCED || MEMDB 
20e20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  || !pPager->dirt
20e30 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d  yCache );.  rc =
20e40 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
20e50 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
20e60 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
20e70 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
20e80 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
20e90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
20eb0 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
20ec0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
20ed0 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
20ee0 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
20ef0 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
20f00 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
20f10 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
20f20 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
20f30 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
20f40 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
20f50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20f60 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
20f70 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
20f80 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
20f90 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
20fa0 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
20fb0 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73  rotocol or unles
20fc0 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
20fd0 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
20fe0 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
20ff0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
21000 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
21010 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
21020 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
21030 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
21040 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
21050 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
21060 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
21070 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
21080 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
21090 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
210a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
210b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
210c0 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
210d0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
210e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
210f0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f   PAGERTRACE2("RO
21100 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
21110 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
21120 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
21130 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
21140 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
21150 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
21160 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
21170 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
21180 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
21190 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
211a0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
211b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
211c0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
211d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
211e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
211f0 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
21200 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
21210 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
21220 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
21230 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
21240 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
21250 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
21260 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
21270 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20    int rc2;.     
21280 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
21290 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
212a0 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70 61 67  .      rc2 = pag
212b0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
212c0 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
212d0 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
212e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
212f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21300 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
21310 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
21320 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
21330 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
21340 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
21350 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
21360 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
21370 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  zeValid = 0;.   
21380 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
21390 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
213a0 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c  ring a ROLLBACK,
213b0 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65   we can no longe
213c0 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65  r trust the page
213d0 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
213e0 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72  So call pager_er
213f0 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79  ror() on the way
21400 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79   out to make any
21410 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20 70   error .    ** p
21420 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20 2a  ersistent..    *
21430 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
21440 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
21450 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
21460 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
21470 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
21480 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
21490 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
214a0 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
214b0 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
214c0 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
214d0 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
214e0 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67 65 72  .u8 sqlite3Pager
214f0 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  Isreadonly(Pager
21500 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21510 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
21520 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Only;.}../*.** R
21530 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
21540 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
21550 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  o the pager..*/.
21560 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21570 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  Refcount(Pager *
21580 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
21590 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  n sqlite3PcacheR
215a0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
215b0 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
215c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
215d0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
215e0 65 73 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  es to the specif
215f0 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74  ied page..*/.int
21600 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
21610 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67 65  eRefcount(DbPage
21620 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
21630 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
21640 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61  PageRefcount(pPa
21650 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ge);.}..#ifdef S
21660 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
21670 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
21680 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
21690 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
216a0 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
216b0 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50  ite3PagerStats(P
216c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
216d0 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31   static int a[11
216e0 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69  ];.  a[0] = sqli
216f0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
21700 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
21710 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c  e);.  a[1] = sql
21720 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
21730 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
21740 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73  che);.  a[2] = s
21750 71 6c 69 74 65 33 50 63 61 63 68 65 47 65 74 43  qlite3PcacheGetC
21760 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
21770 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 33  >pPCache);.  a[3
21780 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
21790 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29 20  zeValid ? (int) 
217a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a  pPager->dbSize :
217b0 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50   -1;.  a[4] = pP
217c0 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
217d0 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
217e0 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20  rCode;.  a[6] = 
217f0 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20  pPager->nHit;.  
21800 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[7] = pPager->n
21810 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30  Miss;.  a[8] = 0
21820 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65  ;  /* Used to be
21830 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a   pPager->nOvfl *
21840 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65  /.  a[9] = pPage
21850 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30  r->nRead;.  a[10
21860 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69  ] = pPager->nWri
21870 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a  te;.  return a;.
21880 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  }.int sqlite3Pag
21890 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20  erIsMemdb(Pager 
218a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
218b0 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 23 65 6e 64  rn MEMDB;.}.#end
218c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  if../*.** Ensure
218d0 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
218e0 61 74 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f  at least nSavepo
218f0 69 6e 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f  int savepoints o
21900 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
21910 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
21920 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
21930 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f  ger, int nSavepo
21940 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
21950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
21960 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e 70 50  f( nSavepoint>pP
21970 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
21980 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
21990 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
219a0 74 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 45 69  t ii;..    /* Ei
219b0 74 68 65 72 20 74 68 65 20 73 75 62 2d 6a 6f 75  ther the sub-jou
219c0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20  rnal is open or 
219d0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
219e0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  ive savepoints. 
219f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
21a00 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
21a10 74 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  t==0 || pPager->
21a20 73 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  sjfd->pMethods )
21a30 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
21a40 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
21a50 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20  int array using 
21a60 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72  realloc(). Retur
21a70 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  n SQLITE_NOMEM. 
21a80 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c     ** if the all
21a90 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f  ocation fails. O
21aa0 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74  therwise, zero t
21ab0 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69  he new portion i
21ac0 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a  n case a .    **
21ad0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
21ae0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70  occurs while pop
21af0 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68  ulating it in th
21b00 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20  e for(...) loop 
21b10 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
21b20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
21b30 20 2a 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53   *aNew = (PagerS
21b40 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74  avepoint *)sqlit
21b50 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
21b60 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
21b70 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61  point, sizeof(Pa
21b80 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53  gerSavepoint)*nS
21b90 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a  avepoint.    );.
21ba0 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
21bb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21bc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
21bd0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e  }.    memset(&aN
21be0 65 77 5b 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ew[pPager->nSave
21bf0 70 6f 69 6e 74 5d 2c 20 30 2c 0a 20 20 20 20 20  point], 0,.     
21c00 20 20 20 28 6e 53 61 76 65 70 6f 69 6e 74 20 2d     (nSavepoint -
21c10 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
21c20 69 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61  int) * sizeof(Pa
21c30 67 65 72 53 61 76 65 70 6f 69 6e 74 29 0a 20 20  gerSavepoint).  
21c40 20 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d    );.    pPager-
21c50 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e  >aSavepoint = aN
21c60 65 77 3b 0a 20 20 20 20 69 69 20 3d 20 70 50 61  ew;.    ii = pPa
21c70 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
21c80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  .    pPager->nSa
21c90 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70  vepoint = nSavep
21ca0 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f  oint;..    /* Po
21cb0 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72  pulate the Pager
21cc0 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
21cd0 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61  ures just alloca
21ce0 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ted. */.    for(
21cf0 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 69 69 3c  /* no-op */; ii<
21d00 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
21d10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21d20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
21d30 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e  alid );.      aN
21d40 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70  ew[ii].nOrig = p
21d50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
21d60 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
21d70 66 66 73 65 74 20 3d 20 28 70 50 61 67 65 72 2d  ffset = (pPager-
21d80 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3f 20 70  >journalOpen ? p
21d90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21da0 66 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 61 4e  f : 0);.      aN
21db0 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d  ew[ii].iSubRec =
21dc0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
21dd0 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  c;.      aNew[ii
21de0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ].pInSavepoint =
21df0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
21e00 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
21e10 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
21e20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76  !aNew[ii].pInSav
21e30 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
21e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21e50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
21e60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65     }..    /* Ope
21e70 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
21e80 6c 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  l, if it is not 
21e90 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20  already opened. 
21ea0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  */.    rc = open
21eb0 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
21ec0 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
21ed0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
21ee0 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73 20 61  arameter op is a
21ef0 6c 77 61 79 73 20 65 69 74 68 65 72 20 53 41 56  lways either SAV
21f00 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
21f10 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
21f20 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69  EASE..** If it i
21f30 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
21f40 41 53 45 2c 20 74 68 65 6e 20 72 65 6c 65 61 73  ASE, then releas
21f50 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68  e and destroy th
21f60 65 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  e savepoint with
21f70 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61 76 65 70  .** index iSavep
21f80 6f 69 6e 74 2e 20 49 66 20 69 74 20 69 73 20 53  oint. If it is S
21f90 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
21fa0 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b  K, then rollback
21fb0 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20   all changes.** 
21fc0 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72 65  that have occure
21fd0 64 20 73 69 6e 63 65 20 73 61 76 65 70 6f 69 6e  d since savepoin
21fe0 74 20 69 53 61 76 65 70 6f 69 6e 74 20 77 61 73  t iSavepoint was
21ff0 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
22000 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
22010 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77  all savepoints w
22020 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65  ith an index gre
22030 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70  ater than iSavep
22040 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73  oint .** are des
22050 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  troyed..**.** If
22060 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20   there are less 
22070 74 68 61 6e 20 28 69 53 61 76 65 70 6f 69 6e 74  than (iSavepoint
22080 2b 31 29 20 61 63 74 69 76 65 20 73 61 76 65 70  +1) active savep
22090 6f 69 6e 74 73 20 77 68 65 6e 20 74 68 69 73 20  oints when this 
220a0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
220b0 63 61 6c 6c 65 64 20 69 74 20 69 73 20 61 20 6e  called it is a n
220c0 6f 2d 6f 70 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  o-op..*/ .int sq
220d0 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
220e0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
220f0 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  r, int op, int i
22100 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
22110 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22120 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
22130 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
22140 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
22150 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
22160 0a 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e  .  if( iSavepoin
22170 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  t<pPager->nSavep
22180 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  oint ){.    int 
22190 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77  ii;.    int nNew
221a0 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20   = iSavepoint + 
221b0 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  (op==SAVEPOINT_R
221c0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 66 6f  OLLBACK);.    fo
221d0 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50  r(ii=nNew; ii<pP
221e0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
221f0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; ii++){.      s
22200 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
22210 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
22220 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
22230 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
22240 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76      pPager->nSav
22250 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a  epoint = nNew;..
22260 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45      if( op==SAVE
22270 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
22280 7b 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76  {.      PagerSav
22290 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
222a0 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 20 3f  nt = (nNew==0) ?
222b0 20 30 20 3a 20 26 70 50 61 67 65 72 2d 3e 61 53   0 : &pPager->aS
222c0 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d  avepoint[nNew-1]
222d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
222e0 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
222f0 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76  int(pPager, pSav
22300 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61  epoint);.      a
22310 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45  ssert(rc!=SQLITE
22320 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 0a 20  _DONE);.    }.. 
22330 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
22340 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68   a release of th
22350 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  e outermost save
22360 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20  point, truncate 
22370 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
22380 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
22390 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 6f  if( nNew==0 && o
223a0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
223b0 45 41 53 45 20 26 26 20 70 50 61 67 65 72 2d 3e  EASE && pPager->
223c0 73 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  sjfd->pMethods )
223d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
223e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
223f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22400 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
22410 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a  ager->sjfd, 0);.
22420 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
22430 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
22440 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
22450 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
22460 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
22470 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
22480 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
22490 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
224a0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
224b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
224c0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
224d0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
224e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
224f0 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  FS structure for
22500 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63   the pager..*/.c
22510 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  onst sqlite3_vfs
22520 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66   *sqlite3PagerVf
22530 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
22540 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
22550 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->pVfs;.}../*.*
22560 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
22570 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  e handle for the
22580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
22590 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
225a0 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  h the pager.  Th
225b0 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  is might return 
225c0 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65  NULL if the file
225d0 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20   has.** not yet 
225e0 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  been opened..*/.
225f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71  sqlite3_file *sq
22600 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50  lite3PagerFile(P
22610 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22620 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
22630 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fd;.}../*.** Ret
22640 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
22650 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
22660 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
22670 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
22680 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72  gerDirname(Pager
22690 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
226a0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
226b0 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
226c0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
226d0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
226e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
226f0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
22700 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
22710 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
22720 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
22730 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
22740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22750 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
22760 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
22770 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
22780 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
22790 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
227a0 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
227b0 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
227c0 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
227d0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
227e0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
227f0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
22800 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
22810 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
22820 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
22830 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
22840 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22850 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
22860 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
22870 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
22880 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
22890 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
228a0 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
228b0 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
228c0 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
228d0 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
228e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
228f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22900 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
22910 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
22920 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
22930 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
22940 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
22950 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
22960 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
22970 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
22980 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
22990 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
229a0 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
229b0 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
229c0 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
229d0 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
229e0 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
229f0 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f  ed at pgno is no
22a00 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
22a10 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
22a20 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
22a30 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20  put there by by 
22a40 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
22a50 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
22a60 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72  o the page pPg r
22a70 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
22a80 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
22a90 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
22aa0 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e  d with pPg (i.e.
22ab0 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
22ac0 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
22ad0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
22ae0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
22af0 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
22b00 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
22b10 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
22b20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
22b30 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
22b40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
22b50 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
22b60 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
22b70 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
22b80 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
22b90 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
22ba0 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
22bb0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
22bc0 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
22bd0 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
22be0 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
22bf0 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
22c00 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
22c10 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tive)..**.** If 
22c20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
22c30 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69  ent, isCommit, i
22c40 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
22c50 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65   this page is be
22c60 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20  ing.** moved as 
22c70 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61  part of a databa
22c80 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f  se reorganizatio
22c90 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  n just before th
22ca0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
22cb0 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * is being commi
22cc0 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  tted. In this ca
22cd0 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  se, it is guaran
22ce0 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61  teed that the da
22cf0 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20  tabase page .** 
22d00 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69  pPg refers to wi
22d10 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
22d20 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69  n to again withi
22d30 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
22d40 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
22d50 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
22d60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
22d70 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
22d80 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d   pgno, int isCom
22d90 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  mit){.  PgHdr *p
22da0 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70  PgOld;  /* The p
22db0 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72  age being overwr
22dc0 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f  itten. */.  Pgno
22dd0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
22de0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
22df0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
22e00 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56  PAGERTRACE5("MOV
22e10 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
22e20 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
22e30 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
22e40 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
22e50 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70  ), pPg->pgno, (p
22e60 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
22e70 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20  NEED_SYNC)?1:0, 
22e80 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45  pgno);.  IOTRACE
22e90 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
22ea0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
22eb0 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
22ec0 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74    pager_get_cont
22ed0 65 6e 74 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  ent(pPg);..  /* 
22ee0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  If the journal n
22ef0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
22f00 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65 20  )ed before page 
22f10 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20  pPg->pgno can.  
22f20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ** be written to
22f30 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e  , store pPg->pgn
22f40 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  o in local varia
22f50 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  ble needSyncPgno
22f60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
22f70 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
22f80 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20 69   is set, there i
22f90 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
22fa0 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20  ember that.  ** 
22fb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
22fc0 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
22fd0 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
22fe0 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20   page pPg->pgno 
22ff0 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  .  ** can be wri
23000 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
23010 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
23020 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
23030 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a  write to it..  *
23040 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c  /.  if( (pPg->fl
23050 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
23060 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d 69  YNC) && !isCommi
23070 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  t ){.    needSyn
23080 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
23090 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
230a0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
230b0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
230c0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
230d0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
230e0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
230f0 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20 61  R_DIRTY );.    a
23100 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
23110 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
23120 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
23130 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67  e contains a pag
23140 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  e with page-numb
23150 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20  er pgno, remove 
23160 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73  it.  ** from its
23170 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
23180 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e  o, if the PgHdr.
23190 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74  needSync was set
231a0 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20   for .  ** page 
231b0 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20  pgno before the 
231c0 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e  'move' operation
231d0 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  , it needs to be
231e0 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20   retained .  ** 
231f0 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76  for the page mov
23200 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ed there..  */. 
23210 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
23220 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
23230 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
23240 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
23250 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74   pgno);.  assert
23260 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67  ( !pPgOld || pPg
23270 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a  Old->nRef==1 );.
23280 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
23290 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
232a0 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73  = (pPgOld->flags
232b0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
232c0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
232d0 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c  3PcacheMove(pPg,
232e0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
232f0 67 4f 6c 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  gOld ){.    sqli
23300 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
23310 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  gOld);.  }..  sq
23320 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
23330 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
23340 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
23350 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 1;.  pPager->d
23360 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a  bModified = 1;..
23370 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
23380 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
23390 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
233a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
233b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
233c0 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
233d0 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
233e0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
233f0 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
23400 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
23410 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
23420 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
23430 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
23440 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
23450 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
23460 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65   ** "is journale
23470 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20 68  d" bitvec flag h
23480 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
23490 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
234a0 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  medied by.    **
234b0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67   loading the pag
234c0 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
234d0 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
234e0 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
234f0 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c  dSync .    ** fl
23500 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
23510 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74  * If the attempt
23520 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67   to load the pag
23530 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d  e into the page-
23540 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75  cache fails, (du
23550 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61  e.    ** to a ma
23560 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
23570 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65  lure), clear the
23580 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a   bit in the pInJ
23590 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20  ournal[].    ** 
235a0 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
235b0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
235c0 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74   loaded and writ
235d0 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20  ten again in.   
235e0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
235f0 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20  tion, it may be 
23600 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
23610 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
23620 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  ore.    ** it is
23630 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
23640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
23650 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20  his way, it may 
23660 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a  end up in.    **
23670 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
23680 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61  e twice, but tha
23690 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  t is not a probl
236a0 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  em..    **.    *
236b0 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
236c0 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
236d0 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
236e0 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
236f0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
23700 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
23710 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
23720 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oo..    */.    i
23730 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72  nt rc;.    PgHdr
23740 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
23750 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
23760 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
23770 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
23780 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
23790 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
237a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
237b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
237c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
237d0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 6e 65 65 64  nJournal && need
237e0 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72  SyncPgno<=pPager
237f0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
23800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
23810 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65  itvecClear(pPage
23820 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e  r->pInJournal, n
23830 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20  eedSyncPgno);.  
23840 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
23850 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
23860 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
23870 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72  c = 1;.    asser
23880 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  t( pPager->noSyn
23890 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29  c==0 && !MEMDB )
238a0 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c  ;.    pPgHdr->fl
238b0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
238c0 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69  D_SYNC;.    sqli
238d0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
238e0 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
238f0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
23900 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
23910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23920 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
23930 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
23940 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61  nter to the data
23950 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
23960 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
23970 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
23980 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50  tData(DbPage *pP
23990 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
239a0 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67  g->nRef>0 || pPg
239b0 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ->pPager->memDb 
239c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  );.  return pPg-
239d0 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pData;.}../*.**
239e0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
239f0 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e  r to the Pager.n
23a00 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22  Extra bytes of "
23a10 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a  extra" space .**
23a20 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
23a30 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
23a40 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
23a50 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
23a60 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a  etExtra(DbPage *
23a70 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
23a80 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
23a90 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ger;.  return (p
23aa0 50 61 67 65 72 3f 70 50 67 2d 3e 70 45 78 74 72  Pager?pPg->pExtr
23ab0 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  a:0);.}../*.** G
23ac0 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69  et/set the locki
23ad0 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  ng-mode for this
23ae0 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
23af0 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
23b00 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f  one.** of PAGER_
23b10 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
23b20 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  Y, PAGER_LOCKING
23b30 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a  MODE_NORMAL or .
23b40 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
23b50 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20  MODE_EXCLUSIVE. 
23b60 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
23b70 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
23b80 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  then.** the lock
23b90 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20  ing-mode is set 
23ba0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65  to the value spe
23bb0 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  cified..**.** Th
23bc0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
23bd0 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52   is either PAGER
23be0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
23bf0 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f  MAL or.** PAGER_
23c00 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
23c10 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e  USIVE, indicatin
23c20 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  g the current (p
23c30 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
23c40 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  .** locking-mode
23c50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23c60 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
23c70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
23c80 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73  int eMode){.  as
23c90 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
23ca0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
23cb0 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
23cc0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
23cd0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
23ce0 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  MAL.            
23cf0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
23d00 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
23d10 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
23d20 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
23d30 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
23d40 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
23d50 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
23d60 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c  AL>=0 && PAGER_L
23d70 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
23d80 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28  SIVE>=0 );.  if(
23d90 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50   eMode>=0 && !pP
23da0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
23db0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  {.    pPager->ex
23dc0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
23dd0 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72  8)eMode;.  }.  r
23de0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
23df0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
23e00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
23e10 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  et the journal-m
23e20 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
23e30 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
23e40 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  ode must be one 
23e50 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47  of:.**.**    PAG
23e60 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
23e70 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52  UERY.**    PAGER
23e80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
23e90 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ETE.**    PAGER_
23ea0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
23eb0 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  CATE.**    PAGER
23ec0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
23ed0 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52  SIST.**    PAGER
23ee0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
23ef0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
23f00 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
23f10 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20  QUERY, then the 
23f20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
23f30 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61  set to the.** va
23f40 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
23f50 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
23f60 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63  d indicate the c
23f70 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
23f80 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f 75   updated).** jou
23f90 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal-mode..*/.in
23fa0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  t sqlite3PagerJo
23fb0 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20  urnalMode(Pager 
23fc0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
23fd0 64 65 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d 44  de){.  if( !MEMD
23fe0 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
23ff0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
24000 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
24010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
24020 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
24030 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
24040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
24050 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
24060 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
24070 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ATE.            
24080 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
24090 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
240a0 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20 20  RSIST.          
240b0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
240c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
240d0 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
240e0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
240f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
24100 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 61 73 73  EMORY );.    ass
24110 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ert( PAGER_JOURN
24120 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  ALMODE_QUERY<0 )
24130 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3e  ;.    if( eMode>
24140 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
24150 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
24160 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20  = (u8)eMode;.   
24170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
24180 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
24190 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
241a0 55 45 52 59 20 29 3b 0a 20 20 20 20 7d 0a 20 20  UERY );.    }.  
241b0 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
241c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
241d0 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ode;.}../*.** Ge
241e0 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c  t/set the size-l
241f0 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65  imit used for pe
24200 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
24210 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73   files..*/.i64 s
24220 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
24230 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65  alSizeLimit(Page
24240 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69  r *pPager, i64 i
24250 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c  Limit){.  if( iL
24260 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20  imit>=-1 ){.    
24270 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
24280 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  izeLimit = iLimi
24290 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
242a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
242b0 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e  izeLimit;.}..#en
242c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
242d0 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a           IT_DISKIO */.