/ Hex Artifact Content
Login

Artifact ec486337fae32dfcaac41f4471c70a0385fe8487:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 32  : pager.c,v 1.52
0350: 34 20 32 30 30 38 2f 31 32 2f 32 37 20 31 35 3a  4 2008/12/27 15:
0360: 32 33 3a 31 33 20 64 61 6e 69 65 6c 6b 31 39 37  23:13 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 2a 0a 2a 2a 20 4d 61 6e 61 67 69 6e 67 20  .**.** Managing 
1d70: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1d80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
1d90: 20 70 61 67 65 73 20 69 73 20 61 20 6c 69 74 74   pages is a litt
1da0: 6c 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a  le complicated..
1db0: 2a 2a 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  ** The variable 
1dc0: 50 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e  Pager.dbSize con
1dd0: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
1de0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1df0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
1e00: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
1e10: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
1e20: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
1e30: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
1e40: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
1e50: 20 69 73 20 75 70 64 61 74 65 64 2e 20 54 68 65   is updated. The
1e60: 20 76 61 72 69 61 62 6c 65 20 50 61 67 65 72 2e   variable Pager.
1e70: 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61  dbFileSize conta
1e80: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  ins the number.*
1e90: 2a 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  * of pages in th
1ea0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1eb0: 20 54 68 69 73 20 6d 61 79 20 62 65 20 64 69 66   This may be dif
1ec0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 50 61 67 65  ferent from Page
1ed0: 72 2e 64 62 53 69 7a 65 0a 2a 2a 20 69 66 20 73  r.dbSize.** if s
1ee0: 6f 6d 65 20 70 61 67 65 73 20 68 61 76 65 20 62  ome pages have b
1ef0: 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20  een appended to 
1f00: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
1f10: 67 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77  ge but not yet w
1f20: 72 69 74 74 65 6e 0a 2a 2a 20 6f 75 74 20 66 72  ritten.** out fr
1f30: 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  om the cache to 
1f40: 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  the actual file 
1f50: 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20 74  on disk. Or if t
1f60: 68 65 20 69 6d 61 67 65 20 68 61 73 20 62 65 65  he image has bee
1f70: 6e 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 62  n.** truncated b
1f80: 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  y an incremental
1f90: 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
1fa0: 6e 2e 20 54 68 65 20 50 61 67 65 72 2e 64 62 4f  n. The Pager.dbO
1fb0: 72 69 67 53 69 7a 65 20 76 61 72 69 61 62 6c 65  rigSize variable
1fc0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
1fd0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1fe0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1ff0: 20 69 6d 61 67 65 20 77 68 65 6e 20 74 68 65 20   image when the 
2000: 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
2010: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2020: 64 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  d. The contents 
2030: 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20  of all three of 
2040: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
2050: 69 73 0a 2a 2a 20 6f 6e 6c 79 20 67 75 61 72 61  is.** only guara
2060: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
2070: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
2080: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
2090: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2f  alid is true..*/
20a0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
20b0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
20c0: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs;          /*
20d0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f   OS functions to
20e0: 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20   use for IO */. 
20f0: 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b   u8 journalOpen;
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2110: 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
2120: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2130: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75   is valid */.  u
2140: 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  8 journalStarted
2150: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
2160: 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20  ue if header of 
2170: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
2180: 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75  d */.  u8 useJou
2190: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
21a0: 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c     /* Use a roll
21b0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20  back journal on 
21c0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75  this file */.  u
21d0: 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20  8 noReadlock;   
21e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
21f0: 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f   not bother to o
2200: 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20  btain readlocks 
2210: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2240: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2250: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
2260: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2270: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
2280: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
2290: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
22a0: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e  ness */.  u8 syn
22b0: 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  c_flags;        
22c0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
22d0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
22e0: 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38  YNC_FULL */.  u8
22f0: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
2300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
2310: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
2320: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
2330: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  tc. */.  u8 temp
2340: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
2350: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2360: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
2370: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
2380: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
2390: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
23a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
23b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
23c0: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
23d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23e0: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
23f0: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
2400: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2410: 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20  dirtyCache;     
2420: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2430: 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73   if cached pages
2440: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f   have changed */
2450: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
2460: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  back;          /
2470: 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f  * Disable DontRo
2480: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
2490: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
24a0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
24b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24c0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
24d0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
24e0: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
24f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2500: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2510: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2520: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20  to jrnl */.  u8 
2530: 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20  doNotSync;      
2540: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
2550: 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c  ean. While true,
2560: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68   do not spill th
2570: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20  e cache */.  u8 
2580: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
2590: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
25a0: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
25b0: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
25c0: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
25d0: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
25e0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74        /* On of t
25f0: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
2600: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
2610: 0a 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64  .  u8 dbModified
2620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2630: 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
2640: 61 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  are any changes 
2650: 74 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75  to the Db */.  u
2660: 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
2670: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
2680: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
2690: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
26a0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
26b0: 64 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20  dbSizeValid;    
26c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
26d0: 77 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63  when dbSize is c
26e0: 6f 72 72 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  orrect */.  Pgno
26f0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
2700: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2710: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2720: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2730: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
2740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
2750: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
2760: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2770: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
2780: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
2790: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27a0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
27b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
27c0: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e0: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
27f0: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2800: 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65  */.  int errCode
2810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2820: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
2830: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
2840: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  rs */.  int nRec
2850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2860: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2870: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
2880: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
2890: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
28a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
28b0: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
28c0: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
28d0: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
28e0: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2900: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
2910: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
2920: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
2930: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
2940: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
2950: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
2960: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
2970: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
2980: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
2990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29a0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
29b0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
29c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29d0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
29e0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
29f0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2a00: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
2a10: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2a20: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
2a30: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
2a40: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  che */.  Pgno mx
2a50: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
2a60: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2a70: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
2a80: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
2a90: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
2aa0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
2ab0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2ac0: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2ae0: 20 42 69 74 76 65 63 20 2a 70 41 6c 77 61 79 73   Bitvec *pAlways
2af0: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 2f 2a 20  Rollback;    /* 
2b00: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2b10: 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
2b20: 61 79 73 2d 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ays-rollback */.
2b30: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
2b40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2b50: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2b60: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2b70: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b90: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
2ba0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
2bb0: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
2bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
2bd0: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
2be0: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
2bf0: 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  files */.  sqlit
2c00: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66  e3_file *fd, *jf
2c10: 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64  d;     /* File d
2c20: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
2c30: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
2c40: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
2c50: 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20  _file *sjfd;    
2c60: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
2c70: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
2c80: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20  sub-journal*/.  
2c90: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
2ca0: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
2cb0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
2cc0: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
2cd0: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
2ce0: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
2cf0: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
2d00: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
2d10: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
2d20: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
2d30: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2d40: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
2d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
2d60: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d80: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
2d90: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
2da0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
2db0: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
2dc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
2dd0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64  ed sector size d
2de0: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a  uring rollback *
2df0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2e00: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
2e10: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
2e20: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
2e30: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
2e40: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
2e50: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
2e60: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
2e70: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
2e80: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
2e90: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
2ea0: 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  e*); /* Call thi
2eb0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
2ec0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
2ed0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2ee0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
2ef0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
2f00: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
2f10: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
2f20: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
2f30: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
2f40: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
2f50: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
2f60: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
2f70: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  ) */.#endif.  ch
2f80: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
2f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2fa0: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
2fb0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
2fc0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72  mp use */.  char
2fd0: 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b   dbFileVers[16];
2fe0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
2ff0: 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61  es whenever data
3000: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
3010: 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  s */.  i64 journ
3020: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
3030: 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74     /* Size limit
3040: 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20   for persistent 
3050: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
3060: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
3070: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
3080: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
3090: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
30a0: 2f 0a 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  /..  PagerSavepo
30b0: 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b  int *aSavepoint;
30c0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
30d0: 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  t;.};../*.** The
30e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
30f0: 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  l variables hold
3100: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66   counters used f
3110: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75  or.** testing pu
3120: 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68  rposes only.  Th
3130: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f  ese variables do
3140: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a   not exist in.**
3150: 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62   a non-testing b
3160: 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72  uild.  These var
3170: 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74  iables are not t
3180: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23  hread-safe..*/.#
3190: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
31a0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  T.int sqlite3_pa
31b0: 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
31c0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
31d0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
31e0: 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f   read from DB */
31f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
3200: 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
3210: 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
3220: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
3230: 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f  written to DB */
3240: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
3250: 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20  er_writej_count 
3260: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
3270: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
3280: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
3290: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
32a0: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
32b0: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
32c0: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
32d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  ..../*.** Journa
32e0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
32f0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
3300: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
3310: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
3320: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
3330: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
3340: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
3350: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
3360: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
3370: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
3380: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3390: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
33a0: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
33b0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
33c0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
33d0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
33e0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
33f0: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
3400: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
3410: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
3420: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
3430: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
3440: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
3450: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
3460: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
3470: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
3480: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
3490: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
34a0: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
34b0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
34c0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
34d0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
34e0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
34f0: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
3500: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
3510: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
3520: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
3530: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3540: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
3550: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
3560: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
3570: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
3580: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
3590: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
35a0: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
35b0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
35c0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
35d0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
35e0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
35f0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
3600: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
3610: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
3620: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
3630: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
3640: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
3650: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
3660: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
3670: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
3680: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
3690: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
36a0: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
36b0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
36c0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
36d0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
36e0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
36f0: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
3700: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
3710: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
3720: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
3730: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
3740: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
3750: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
3760: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
3770: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
3780: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
3790: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
37a0: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
37b0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
37c0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
37d0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
37e0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
37f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3800: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
3810: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
3820: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
3830: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
3840: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
3850: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
3860: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
3870: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
3880: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
3890: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
38a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
38b0: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
38c0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
38d0: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
38e0: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
38f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
3900: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
3910: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
3920: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
3930: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
3940: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
3950: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
3960: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
3970: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
3980: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
3990: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
39a0: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
39b0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
39c0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
39d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
39e0: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
39f0: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
3a00: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
3a10: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
3a20: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
3a30: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
3a40: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
3a50: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
3a60: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
3a70: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
3a80: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
3a90: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
3aa0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
3ab0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
3ac0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
3ad0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
3ae0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
3af0: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
3b00: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
3b10: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
3b20: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
3b30: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
3b40: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
3b50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65  ndif../*.** Page
3b60: 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a   number PAGER_MJ
3b70: 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75  _PGNO is never u
3b80: 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  sed in an SQLite
3b90: 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73   database (it is
3ba0: 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72  .** reserved for
3bb0: 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20   working around 
3bc0: 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20  a windows/posix 
3bd0: 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29  incompatibility)
3be0: 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20  . It is.** used 
3bf0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  in the journal t
3c00: 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74  o signify that t
3c10: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
3c20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3c30: 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20   .** is devoted 
3c40: 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73  to storing a mas
3c50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
3c60: 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   - there are no 
3c70: 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a  more pages to.**
3c80: 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20   roll back. See 
3c90: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e  comments for fun
3ca0: 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65  ction writeMaste
3cb0: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64  rJournal() for d
3cc0: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64  etails..*/./* #d
3cd0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
3ce0: 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f  GNO(x) (PENDING_
3cf0: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
3d00: 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65  ize)) */.#define
3d10: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
3d20: 29 20 28 28 50 67 6e 6f 29 28 28 50 45 4e 44 49  ) ((Pgno)((PENDI
3d30: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
3d40: 67 65 53 69 7a 65 29 29 2b 31 29 29 0a 0a 2f 2a  geSize))+1))../*
3d50: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
3d60: 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
3d70: 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e  r is (2^31 - 1).
3d80: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
3d90: 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34  R_MAX_PGNO 21474
3da0: 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  83647../*.** Ret
3db0: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
3dc0: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
3dd0: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
3de0: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
3df0: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
3e00: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
3e10: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
3e20: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
3e30: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
3e40: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
3e50: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
3e60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
3e70: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
3e80: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
3e90: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
3ea0: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
3eb0: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
3ec0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
3ed0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
3ee0: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
3ef0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
3f00: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
3f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3f20: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
3f30: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
3f40: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
3f50: 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
3f60: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
3f70: 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ger;.  int i;.  
3f80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
3f90: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
3fa0: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
3fb0: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
3fc0: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
3fd0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
3fe0: 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30  nOrig>=pgno && 0
3ff0: 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ==sqlite3BitvecT
4000: 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  est(p->pInSavepo
4010: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
4020: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4030: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4040: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
4050: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
4060: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
4070: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
4080: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
4090: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
40a0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
40b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
40c0: 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50  tvecTest(pPg->pP
40d0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
40e0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
40f0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
4100: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
4110: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
4120: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
4130: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
4140: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
4150: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
4160: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
4170: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
4180: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
4190: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
41a0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
41b0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
41c0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
41d0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
41e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
41f0: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
4200: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
4210: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
4220: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
4230: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
4240: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
4250: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
4260: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
4270: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4280: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
4290: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
42a0: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
42b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
42c0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
42d0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
42e0: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
42f0: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
4300: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
4310: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
4320: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
4330: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
4340: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
4350: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
4360: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
4370: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
4380: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
4390: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
43a0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
43b0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
43c0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
43d0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
43e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
43f0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
4400: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
4410: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
4420: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
4430: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
4440: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
4450: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
4460: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
4470: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
4480: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
4490: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
44a0: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
44b0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
44c0: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
44d0: 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20   !pFd->pMethods 
44e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
44f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
4500: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55  eturn sqlite3OsU
4510: 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b  nlock(pFd, eLock
4520: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
4530: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
4540: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
4550: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
4560: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
4570: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
4580: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
4590: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
45a0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
45b0: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
45c0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
45d0: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
45e0: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
45f0: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
4600: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
4610: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
4620: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
4630: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
4640: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
4650: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
4660: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
4670: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
4680: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
4690: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
46a0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
46b0: 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20  t be used, 0 is 
46c0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
46d0: 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20  can be used,.** 
46e0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
46f0: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
4700: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
4710: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a  al file when it.
4720: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c  ** contains roll
4730: 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78  back data for ex
4740: 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a  actly one page..
4750: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4760: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
4770: 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20  RITE.static int 
4780: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
4790: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
47a0: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
47b0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
47c0: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
47d0: 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20    int nSector;  
47e0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
47f0: 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 50 61  ze */.  int szPa
4800: 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ge;        /* Pa
4810: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c  ge size */.  sql
4820: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
4830: 70 50 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69  pPager->fd;..  i
4840: 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  f( fd->pMethods 
4850: 29 7b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  ){.    dc = sqli
4860: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
4870: 63 74 65 72 69 73 74 69 63 73 28 66 64 29 3b 0a  cteristics(fd);.
4880: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 73 71      nSector = sq
4890: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
48a0: 65 28 66 64 29 3b 0a 20 20 20 20 73 7a 50 61 67  e(fd);.    szPag
48b0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
48c0: 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  Size;.  }..  ass
48d0: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
48e0: 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
48f0: 3e 3e 38 29 29 3b 0a 20 20 61 73 73 65 72 74 28  >>8));.  assert(
4900: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
4910: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
4920: 38 29 29 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d  8));..  if( !fd-
4930: 3e 70 4d 65 74 68 6f 64 73 20 7c 7c 20 0a 20 20  >pMethods || .  
4940: 20 20 20 20 20 28 64 63 20 26 20 28 53 51 4c 49       (dc & (SQLI
4950: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
4960: 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 26 26 20  (szPage>>8)) && 
4970: 6e 53 65 63 74 6f 72 3c 3d 73 7a 50 61 67 65 29  nSector<=szPage)
4980: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a   ){.    return J
4990: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
49a0: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
49b0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
49c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
49d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
49e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
49f0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
4a00: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
4a10: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
4a20: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
4a30: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4a40: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4a50: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
4a60: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
4a70: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
4a80: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
4a90: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
4aa0: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
4ab0: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
4ac0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
4ad0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
4ae0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
4af0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
4b00: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
4b10: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
4b20: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
4b30: 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49  CORRUPT, or SQLI
4b40: 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65  TE_FULL.** the e
4b50: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
4b60: 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74  sistent. Until t
4b70: 68 65 20 70 65 72 73 69 73 74 65 6e 20 65 72 72  he persisten err
4b80: 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a  or is cleared,.*
4b90: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49  * subsequent API
4ba0: 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50   calls on this P
4bb0: 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
4bc0: 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65  ately return the
4bd0: 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20   same .** error 
4be0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65  code..**.** A pe
4bf0: 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69  rsistent error i
4c00: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
4c10: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
4c20: 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
4c30: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
4c40: 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
4c50: 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
4c60: 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
4c70: 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
4c80: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
4c90: 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
4ca0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
4cb0: 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
4cc0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
4cd0: 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 74  error occured, t
4ce0: 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
4cf0: 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65   journal may nee
4d00: 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61  d.** to be repla
4d10: 79 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  yed..*/.static v
4d20: 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
4d30: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b  (Pager *pPager);
4d40: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
4d50: 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
4d60: 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
4d70: 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
4d80: 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
4d90: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
4da0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
4db0: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
4dc0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
4dd0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
4de0: 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
4df0: 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
4e00: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
4e10: 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53    if(.    rc2==S
4e20: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
4e30: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f    rc2==SQLITE_IO
4e40: 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ERR ||.    rc2==
4e50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20  SQLITE_CORRUPT. 
4e60: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
4e70: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
4e80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
4e90: 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
4ea0: 4b 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  K .     && sqlit
4eb0: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
4ec0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
4ed0: 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )==0 .    ){.   
4ee0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
4ef0: 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e  er is already un
4f00: 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67  locked, call pag
4f10: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20  er_unlock() now 
4f20: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61  to.      ** clea
4f30: 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
4f40: 65 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61  e and ensure tha
4f50: 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
4f60: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63  e is .      ** c
4f70: 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
4f80: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4f90: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
4fa0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
4fb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4fc0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
4fd0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
4fe0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
4ff0: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
5000: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
5010: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
5020: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
5030: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
5040: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
5050: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
5060: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
5070: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
5080: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
5090: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
50a0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
50b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
50c0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
50d0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
50e0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
50f0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
5100: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
5110: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
5120: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
5130: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
5140: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
5150: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
5160: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
5170: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
5180: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
5190: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
51a0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
51b0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
51c0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
51d0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
51e0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
51f0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
5200: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
5210: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
5220: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
5230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
5240: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
5250: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
5260: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
5270: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
5280: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
5290: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
52a0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
52b0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
52c0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
52d0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
52e0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
52f0: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
5300: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
5310: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
5320: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
5330: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
5340: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
5350: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
5360: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
5370: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
5380: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
5390: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
53a0: 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  er->errCode.    
53b0: 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73    || (pPg->flags
53c0: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
53d0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
53e0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
53f0: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
5400: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
5410: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
5420: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
5430: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
5440: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
5450: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
5460: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
5470: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
5480: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
5490: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
54a0: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
54b0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
54c0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
54d0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
54e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65   read from the e
54f0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
5500: 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  nd .** written i
5510: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
5520: 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
5530: 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  r. .**.** zMaste
5540: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
5550: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
5560: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
5570: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
5580: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
5590: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
55a0: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
55b0: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
55c0: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
55d0: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
55e0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
55f0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
5600: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
5610: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
5620: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
5630: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
5640: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
5650: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
5660: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
5670: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
5680: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
5690: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
56a0: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
56b0: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
56c0: 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   If no master jo
56d0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
56e0: 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73 74  is present zMast
56f0: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
5700: 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  0 and.** SQLITE_
5710: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
5720: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
5730: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
5740: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
5750: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
5760: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
5770: 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c   int rc;.  u32 l
5780: 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20  en;.  i64 szJ;. 
5790: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 75 33   u32 cksum;.  u3
57a0: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
57b0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
57c0: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
57d0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
57e0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
57f0: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
5800: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
5810: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72  er */..  zMaster
5820: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72  [0] = '\0';..  r
5830: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
5840: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
5850: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
5860: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31  LITE_OK || szJ<1
5870: 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  6 ) return rc;..
5880: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
5890: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
58a0: 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63   &len);.  if( rc
58b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
58c0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
58d0: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a  len>=nMaster ){.
58e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
58f0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
5900: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
5910: 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73  nl, szJ-12, &cks
5920: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
5930: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5940: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
5950: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
5960: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
5970: 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  J-8);.  if( rc!=
5980: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d  SQLITE_OK || mem
5990: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
59a0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20  rnalMagic, 8) ) 
59b0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
59c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
59d0: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
59e0: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
59f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5a00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
5a10: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a  turn rc;.  }.  z
5a20: 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c  Master[len] = '\
5a30: 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66  0';..  /* See if
5a40: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
5a50: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
5a60: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
5a70: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
5a80: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
5a90: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
5aa0: 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ;.   }.  if( cks
5ab0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
5ac0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
5ad0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
5ae0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
5af0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
5b00: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
5b10: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
5b20: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
5b30: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
5b40: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
5b50: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
5b60: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
5b70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
5b80: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
5b90: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
5ba0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
5bb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61  ..    */.    zMa
5bc0: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
5bd0: 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e    }.   .  return
5be0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5bf0: 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f  *.** Seek the jo
5c00: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
5c10: 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  iptor to the nex
5c20: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
5c30: 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75  y where a.** jou
5c40: 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20  rnal header may 
5c50: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
5c60: 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  en. Pager.journa
5c70: 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20  lOff is updated 
5c80: 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20  with.** the new 
5c90: 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a  seek offset..**.
5ca0: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
5cb0: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
5cc0: 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66  .**.** Input Off
5cd0: 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
5ce0: 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a   Output Offset.*
5cf0: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
5d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20  ---------.** 0  
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20         0.** 512 
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30        512.** 100
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30         512.** 20
5d80: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
5d90: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
5da0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5db0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
5dc0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5dd0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
5de0: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
5df0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5e00: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
5e10: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
5e20: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5e30: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
5e40: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5e50: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
5e60: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
5e70: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
5e80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5e90: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
5ea0: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
5eb0: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
5ec0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
5ed0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5ee0: 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a   = offset;.}../*
5ef0: 0a 2a 2a 20 57 72 69 74 65 20 7a 65 72 6f 73 20  .** Write zeros 
5f00: 6f 76 65 72 20 74 68 65 20 68 65 61 64 65 72 20  over the header 
5f10: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
5f20: 69 6c 65 2e 20 20 54 68 69 73 20 68 61 73 20 74  ile.  This has t
5f30: 68 65 0a 2a 2a 20 65 66 66 65 63 74 20 6f 66 20  he.** effect of 
5f40: 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
5f50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
5f60: 64 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65  d committing the
5f70: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
5f80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
5f90: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
5fa0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
5fb0: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
5fc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5fd0: 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  OK;.  static con
5fe0: 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b  st char zeroHdr[
5ff0: 32 38 5d 20 3d 20 7b 30 7d 3b 0a 0a 20 20 69 66  28] = {0};..  if
6000: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
6010: 6c 4f 66 66 20 29 7b 0a 20 20 20 20 69 36 34 20  lOff ){.    i64 
6020: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
6030: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
6040: 74 3b 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  t;..    IOTRACE(
6050: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
6060: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
6070: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
6080: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
6090: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
60a0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
60b0: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
60c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
60d0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
60e0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
60f0: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
6100: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
6110: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
6120: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
6130: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
6140: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6150: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
6160: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
6170: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
6180: 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
6190: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
61a0: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72  his point the tr
61b0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
61c0: 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77  mitted but the w
61d0: 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a  rite lock .    *
61e0: 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  * is still held 
61f0: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  on the file. If 
6200: 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20  there is a size 
6210: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
6220: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65   for .    ** the
6230: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
6240: 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  nal and the jour
6250: 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
6260: 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65  ly consumes more
6270: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68  .    ** space th
6280: 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c  an that limit al
6290: 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61  lows for, trunca
62a0: 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65  te it now. There
62b0: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
62c0: 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66  ** to sync the f
62d0: 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ile following th
62e0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
62f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
6300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
6310: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  imit>0 ){.      
6320: 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63  i64 sz;.      rc
6330: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
6340: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
6350: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  , &sz);.      if
6360: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6370: 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a  && sz>iLimit ){.
6380: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
6390: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
63a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d  Pager->jfd, iLim
63b0: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
63c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
63d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
63e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
63f0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
6400: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6410: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
6420: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
6430: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
6440: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
6450: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
6460: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
6470: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
6480: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
6490: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
64a0: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
64b0: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
64c0: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
64d0: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
64e0: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
64f0: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
6500: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
6510: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
6520: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
6530: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
6540: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
6550: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
6560: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
6570: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
6580: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
6590: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
65a0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
65b0: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
65c0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
65d0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74  * - 4 bytes: Dat
65e0: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
65f0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
6600: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
6610: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
6620: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
6630: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
6640: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
6650: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6660: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6670: 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65  _OK;.  char *zHe
6680: 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ader = pPager->p
6690: 54 6d 70 53 70 61 63 65 3b 0a 20 20 75 33 32 20  TmpSpace;.  u32 
66a0: 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  nHeader = pPager
66b0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 75 33  ->pageSize;.  u3
66c0: 32 20 6e 57 72 69 74 65 3b 0a 20 20 69 6e 74 20  2 nWrite;.  int 
66d0: 69 69 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64  ii;..  if( nHead
66e0: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
66f0: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
6700: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
6710: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6720: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
6730: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
6740: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
6750: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
6760: 20 63 72 65 61 74 65 64 20 73 69 6e 63 65 20 74   created since t
6770: 68 65 0a 20 20 2a 2a 20 6d 6f 73 74 20 72 65 63  he.  ** most rec
6780: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ent journal head
6790: 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20  er was written, 
67a0: 75 70 64 61 74 65 20 74 68 65 20 50 61 67 65 72  update the Pager
67b0: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
67c0: 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20 6e 6f  f.  ** fields no
67d0: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
67e0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
67f0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
6800: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
6810: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
6820: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
6830: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
6840: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
6850: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
6860: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
6870: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 65      }.  }..  see
6880: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
6890: 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  er);.  pPager->j
68a0: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
68b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
68c0: 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65  .  memcpy(zHeade
68d0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
68e0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
68f0: 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20  lMagic));..  /* 
6900: 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20  .  ** Write the 
6910: 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65  nRec Field - the
6920: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
6930: 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c  records that fol
6940: 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f  low this.  ** jo
6950: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f  urnal header. No
6960: 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20  rmally, zero is 
6970: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20  written to this 
6980: 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69  value at this ti
6990: 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74  me..  ** After t
69a0: 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61  he records are a
69b0: 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  dded to the jour
69c0: 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75  nal (and the jou
69d0: 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20  rnal synced, .  
69e0: 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79  ** if in full-sy
69f0: 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65  nc mode), the ze
6a00: 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ro is overwritte
6a10: 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20  n with the true 
6a20: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72  number.  ** of r
6a30: 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63  ecords (see sync
6a40: 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a  Journal())..  **
6a50: 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61  .  ** A faster a
6a60: 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f  lternative is to
6a70: 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46   write 0xFFFFFFF
6a80: 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69  F to the nRec fi
6a90: 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72  eld. When.  ** r
6aa0: 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eading the journ
6ab0: 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65  al this value te
6ac0: 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73  lls SQLite to as
6ad0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20  sume that the.  
6ae0: 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  ** rest of the j
6af0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
6b00: 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20  ains valid page 
6b10: 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73  records. This as
6b20: 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  sumption.  ** is
6b30: 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69   dangerous, as i
6b40: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
6b50: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
6b60: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
6b70: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
6b80: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
6b90: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
6ba0: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
6bb0: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
6bc0: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
6bd0: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
6be0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
6bf0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
6c00: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
6c10: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
6c20: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
6c30: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
6c40: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
6c50: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
6c60: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
6c70: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
6c80: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
6c90: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
6ca0: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
6cb0: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
6cc0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
6cd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
6ce0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 50 61   */.  assert(pPa
6cf0: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
6d00: 73 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  s||pPager->noSyn
6d10: 63 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65  c);.  if( (pPage
6d20: 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70  r->noSync) || (p
6d30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
6d40: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
6d50: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20  LMODE_MEMORY).  
6d60: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
6d70: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
6d80: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
6d90: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
6da0: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
6db0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
6dc0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6dd0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
6de0: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
6df0: 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69  lse{.    put32bi
6e00: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6e10: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6e20: 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )], 0);.  }..  /
6e30: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
6e40: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
6e50: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
6e60: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
6e70: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
6e80: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
6e90: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
6ea0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6eb0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6ec0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
6ed0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
6ee0: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
6ef0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
6f00: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6f10: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6f20: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
6f30: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
6f40: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
6f50: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
6f60: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
6f70: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
6f80: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6f90: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6fa0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
6fb0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
6fc0: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
6fd0: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
6fe0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
6ff0: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
7000: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
7010: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
7020: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
7030: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
7040: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
7050: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
7060: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
7070: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
7080: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
7090: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
70a0: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
70b0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
70c0: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
70d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
70e0: 2b 31 36 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +16], 0,.       
70f0: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
7100: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7110: 2b 31 36 29 29 3b 0a 0a 20 20 69 66 28 20 70 50  +16));..  if( pP
7120: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
7130: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
7140: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
7150: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
7160: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
7170: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c  urnalMagic)+16],
7180: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7190: 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 6e  e);.  }..  for(n
71a0: 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c  Write=0; rc==SQL
71b0: 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a  ITE_OK&&nWrite<J
71c0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
71d0: 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e  ager); nWrite+=n
71e0: 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54  Header){.    IOT
71f0: 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
7200: 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
7210: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
7220: 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29  alHdr, nHeader))
7230: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7240: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
7250: 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e  >jfd, zHeader, n
7260: 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e  Header, pPager->
7270: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20  journalOff);.   
7280: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7290: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
72a0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
72b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
72c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
72d0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
72e0: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
72f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
7300: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
7310: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
7320: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
7330: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
7340: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
7350: 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d  * file. See comm
7360: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
7370: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
7380: 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63  Hdr() for a desc
7390: 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ription of.** th
73a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
73b0: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
73c0: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
73d0: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
73e0: 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20  y, *nRec is set 
73f0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
7400: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
7410: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
7420: 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69  header and *dbSi
7430: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
7440: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
7450: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
7460: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7470: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
7480: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
7490: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
74a0: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
74b0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
74c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
74d0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
74e0: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
74f0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
7500: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7510: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
7520: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
7530: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
7540: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e   returned and *n
7550: 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  Rec and *dbSize 
7560: 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66  are not set.  If
7570: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
7580: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
7590: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
75a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
75b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
75c0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
75d0: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
75e0: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
75f0: 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a  pPager, .  i64 j
7600: 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33  ournalSize,.  u3
7610: 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32  2 *pNRec, .  u32
7620: 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69   *pDbSize.){.  i
7630: 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
7640: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
7650: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
7660: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
7670: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
7680: 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 6e 74 20 69  jrnlOff;.  int i
7690: 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 73 65 65  PageSize;..  see
76a0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
76b0: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
76c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f  r->journalOff+JO
76d0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
76e0: 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69  ger) > journalSi
76f0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
7700: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
7710: 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50  }.  jrnlOff = pP
7720: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7730: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
7740: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
7750: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
7760: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e  eof(aMagic), jrn
7770: 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 20  lOff);.  if( rc 
7780: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
7790: 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66  rnlOff += sizeof
77a0: 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66 28  (aMagic);..  if(
77b0: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
77c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
77d0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
77e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
77f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
7800: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7810: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7820: 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29   jrnlOff, pNRec)
7830: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7840: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
7850: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7860: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
7870: 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  4, &pPager->cksu
7880: 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63  mInit);.  if( rc
7890: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
78a0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
78b0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
78c0: 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a 65  nlOff+8, pDbSize
78d0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
78e0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
78f0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
7900: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
7910: 2b 31 36 2c 20 28 75 33 32 20 2a 29 26 69 50 61  +16, (u32 *)&iPa
7920: 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  geSize);.  if( r
7930: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
7940: 20 26 26 20 69 50 61 67 65 53 69 7a 65 3e 3d 35   && iPageSize>=5
7950: 31 32 20 0a 20 20 20 26 26 20 69 50 61 67 65 53  12 .   && iPageS
7960: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
7970: 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 26 26  PAGE_SIZE .   &&
7980: 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
7990: 69 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 0a 20  iPageSize)==0 . 
79a0: 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65   ){.    u16 page
79b0: 73 69 7a 65 20 3d 20 28 75 31 36 29 69 50 61 67  size = (u16)iPag
79c0: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
79d0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
79e0: 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
79f0: 26 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 7d 0a  &pagesize);.  }.
7a00: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
7a10: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  n rc;..  /* Upda
7a20: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
7a30: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
7a40: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
7a50: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20  ed by .  ** the 
7a60: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
7a70: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
7a80: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
7a90: 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61  al was.  ** crea
7aa0: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
7ab0: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
7ac0: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
7ad0: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
7ae0: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
7af0: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
7b00: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
7b10: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ocal value.  ** 
7b20: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
7b30: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
7b40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
7b50: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  at routine..  */
7b60: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7b70: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7b80: 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 26 70 50 61  jrnlOff+12, &pPa
7b90: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
7ba0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7bb0: 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 28 70  urn rc;.  if( (p
7bc0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
7bd0: 65 20 26 20 28 70 50 61 67 65 72 2d 3e 73 65 63  e & (pPager->sec
7be0: 74 6f 72 53 69 7a 65 2d 31 29 29 21 3d 30 0a 20  torSize-1))!=0. 
7bf0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
7c00: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 30 78  r->sectorSize>0x
7c10: 31 30 30 30 30 30 30 20 29 7b 0a 20 20 20 20 72  1000000 ){.    r
7c20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
7c30: 45 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  E;.  }..  pPager
7c40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
7c50: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7c60: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
7c70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
7c80: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
7c90: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
7ca0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
7cb0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
7cc0: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
7cd0: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
7ce0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
7cf0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
7d00: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
7d10: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
7d20: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
7d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
7d40: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
7d50: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
7d60: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
7d70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
7d80: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
7d90: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
7da0: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
7db0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
7dc0: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
7dd0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62   is:.**.** + 4 b
7de0: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
7df0: 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65  GNO..** + N byte
7e00: 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  s: length of mas
7e10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7e20: 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  ..** + 4 bytes: 
7e30: 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  N.** + 4 bytes: 
7e40: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
7e50: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
7e60: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
7e70: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
7e80: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
7e90: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
7ea0: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
7eb0: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
7ec0: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
7ed0: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  rnal name..**.**
7ee0: 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
7ef0: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
7f00: 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
7f10: 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
7f20: 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
7f30: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
7f40: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
7f50: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
7f60: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
7f70: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
7f80: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
7f90: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
7fa0: 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20    int i; .  i64 
7fb0: 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 36 34 20 6a  jrnlOff;.  i64 j
7fc0: 72 6e 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 63  rnlSize;.  u32 c
7fd0: 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72  ksum = 0;.  char
7fe0: 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f   zBuf[sizeof(aJo
7ff0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d  urnalMagic)+2*4]
8000: 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
8010: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
8020: 4d 61 73 74 65 72 20 29 20 72 65 74 75 72 6e 20  Master ) return 
8030: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
8040: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8050: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
8060: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
8070: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8080: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  K;.  pPager->set
8090: 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c  Master = 1;..  l
80a0: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
80b0: 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 3b 0a 20  en30(zMaster);. 
80c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
80d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
80e0: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a   += zMaster[i];.
80f0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
8100: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
8110: 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
8120: 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
8130: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
8140: 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
8150: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
8160: 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
8170: 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
8180: 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
8190: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
81a0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
81b0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
81c0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
81d0: 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e  ){.    seekJourn
81e0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
81f0: 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70   }.  jrnlOff = p
8200: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8210: 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  f;.  pPager->jou
8220: 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b  rnalOff += (len+
8230: 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  20);..  rc = wri
8240: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
8250: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50  >jfd, jrnlOff, P
8260: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
8270: 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21  ger));.  if( rc!
8280: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8290: 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66  urn rc;.  jrnlOf
82a0: 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20  f += 4;..  rc = 
82b0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
82c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
82d0: 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66  ter, len, jrnlOf
82e0: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  f);.  if( rc!=SQ
82f0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8300: 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b   rc;.  jrnlOff +
8310: 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62  = len;..  put32b
8320: 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a  its(zBuf, len);.
8330: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 42 75    put32bits(&zBu
8340: 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  f[4], cksum);.  
8350: 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c  memcpy(&zBuf[8],
8360: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
8370: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8380: 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73  agic));.  rc = s
8390: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
83a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c  ager->jfd, zBuf,
83b0: 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   8+sizeof(aJourn
83c0: 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66  alMagic), jrnlOf
83d0: 66 29 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  f);.  jrnlOff +=
83e0: 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   8+sizeof(aJourn
83f0: 61 6c 4d 61 67 69 63 29 3b 0a 20 20 70 50 61 67  alMagic);.  pPag
8400: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
8410: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
8420: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
8430: 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
8440: 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
8450: 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
8460: 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
8470: 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
8480: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8490: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
84a0: 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
84b0: 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
84c0: 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
84d0: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
84e0: 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
84f0: 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
8500: 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
8510: 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
8520: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
8530: 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
8540: 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
8550: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
8560: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
8570: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
8580: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
8590: 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
85a0: 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
85b0: 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
85c0: 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
85d0: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
85e0: 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
85f0: 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
8600: 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 28 72  ..  */ .  if( (r
8610: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20  c==SQLITE_OK).  
8620: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
8630: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
8640: 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
8650: 7a 65 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ze))==SQLITE_OK.
8660: 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a     && jrnlSize>j
8670: 72 6e 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  rnlOff.  ){.    
8680: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
8690: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
86a0: 66 64 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  fd, jrnlOff);.  
86b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
86c0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
86d0: 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
86e0: 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
86f0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65  page number.  Re
8700: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
8710: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72  r to the page or
8720: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
8730: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  nd..*/.static Pg
8740: 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75  Hdr *pager_looku
8750: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
8760: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
8770: 67 48 64 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74  gHdr *p;.  sqlit
8780: 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
8790: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
87a0: 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72  gno, 0, &p);.  r
87b0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
87c0: 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  * Clear the in-m
87d0: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
87e0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
87f0: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
8800: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
8810: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
8820: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
8830: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
8840: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
8850: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
8860: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
8870: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
8880: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
8890: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
88a0: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
88b0: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
88c0: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
88d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
88e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
88f0: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
8900: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
8910: 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
8920: 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
8930: 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
8940: 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
8950: 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
8960: 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
8970: 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
8980: 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
8990: 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
89a0: 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
89b0: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
89c0: 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
89d0: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
89e0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
89f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8a00: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
8a10: 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
8a20: 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  er){.  int ii;. 
8a30: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
8a40: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
8a50: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ; ii++){.    sql
8a60: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
8a70: 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  y(pPager->aSavep
8a80: 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65  oint[ii].pInSave
8a90: 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66  point);.  }.  if
8aa0: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
8ab0: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
8ac0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
8ad0: 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
8ae0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
8af0: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
8b00: 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
8b10: 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
8b20: 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
8b30: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
8b40: 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
8b50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
8b60: 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67  he bit number pg
8b70: 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53  no in the PagerS
8b80: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
8b90: 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
8ba0: 0a 2a 2a 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  .** all open sav
8bb0: 65 70 6f 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  epoints..*/.stat
8bc0: 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
8bd0: 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
8be0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
8bf0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
8c00: 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
8c10: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
8c20: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
8c30: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
8c40: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
8c50: 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  vepoint[ii];.   
8c60: 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f   if( pgno<=p->nO
8c70: 72 69 67 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rig ){.      /* 
8c80: 54 4f 44 4f 3a 20 6d 61 6c 6c 6f 63 28 29 20 66  TODO: malloc() f
8c90: 61 69 6c 75 72 65 20 68 61 6e 64 6c 69 6e 67 20  ailure handling 
8ca0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
8cb0: 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
8cc0: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
8cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
8ce0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
8d00: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8d10: 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
8d20: 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
8d30: 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61  tly in error sta
8d40: 74 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20  te, discard the 
8d50: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20  contents of .** 
8d60: 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
8d70: 73 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74  set the Pager st
8d80: 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c  ructure internal
8d90: 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65   state. If there
8da0: 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a   is.** an open j
8db0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65  ournal-file, the
8dc0: 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  n the next time 
8dd0: 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
8de0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20   obtained.** on 
8df0: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28  the pager file (
8e00: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
8e10: 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69  ther process), i
8e20: 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65  t will be.** tre
8e30: 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f  ated as a hot-jo
8e40: 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
8e50: 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
8e60: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
8e70: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
8e80: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
8e90: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
8ea0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
8eb0: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
8ec0: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
8ed0: 20 20 20 69 66 28 20 72 63 20 29 20 70 50 61 67     if( rc ) pPag
8ee0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
8ef0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
8f00: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
8f10: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
8f20: 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OCK %p\n", pPage
8f30: 72 29 29 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61  r))..    /* Alwa
8f40: 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ys close the jou
8f50: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
8f60: 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
8f70: 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a  base lock..    *
8f80: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f  * Otherwise, ano
8f90: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
8fa0: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
8fb0: 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20  e=delete might. 
8fc0: 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65     ** delete the
8fd0: 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75   file out from u
8fe0: 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
8ff0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9000: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
9010: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
9020: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
9030: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
9040: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
9050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69  .      sqlite3Bi
9060: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
9070: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
9080: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
9090: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
90a0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
90b0: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
90c0: 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
90d0: 6b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  k);.      pPager
90e0: 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
90f0: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  k = 0;.    }..  
9100: 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72    /* If Pager.er
9110: 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68  rCode is set, th
9120: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
9130: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61  e pager cache ca
9140: 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20 74  nnot be.    ** t
9150: 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
9160: 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
9170: 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  is unlocked, the
9180: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
9190: 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61  .    ** cache ca
91a0: 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61  n be discarded a
91b0: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
91c0: 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64  e safely cleared
91d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
91e0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
91f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
9200: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50  ==SQLITE_OK ) pP
9210: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
9220: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
9230: 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
9240: 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  ger);.      rele
9250: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28  aseAllSavepoint(
9260: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
9270: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9280: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
9290: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
92a0: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ted = 0;.      p
92b0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
92c0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
92d0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
92e0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
92f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
9300: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
9310: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
9320: 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
9330: 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
9340: 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
9350: 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
9360: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
9370: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
9380: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
9390: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
93a0: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  .** do not attem
93b0: 70 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  pt the rollback.
93c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
93d0: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
93e0: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29  llback(Pager *p)
93f0: 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f  {.  if( p->errCo
9400: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de==SQLITE_OK &&
9410: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
9420: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
9430: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
9440: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
9450: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
9460: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 20 20 73 71  lback(p);.    sq
9470: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
9480: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61  lloc();.  }.  pa
9490: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d  ger_unlock(p);.}
94a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
94b0: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
94c0: 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e  saction.  A tran
94d0: 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
94e0: 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20   by either.** a 
94f0: 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
9500: 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  BACK..**.** When
9510: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9520: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
9530: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
9540: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
9550: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
9560: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
9570: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
9580: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9590: 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20  will release.** 
95a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
95b0: 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  k and acquires a
95c0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20   SHARED lock in 
95d0: 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61  its place if tha
95e0: 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72  t is.** the appr
95f0: 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f  opriate thing to
9600: 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f   do.  Release lo
9610: 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61  cks usually is a
9620: 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75  ppropriate,.** u
9630: 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20  nless we are in 
9640: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
9650: 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20   mode or unless 
9660: 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f  this is a .** CO
9670: 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f  MMIT AND BEGIN o
9680: 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42  r ROLLBACK AND B
9690: 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  EGIN operation..
96a0: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
96b0: 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72  l file is either
96c0: 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e   deleted or trun
96d0: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  cated..**.** TOD
96e0: 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70  O: Consider keep
96f0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
9700: 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65  file open for te
9710: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
9720: 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74  s..** This might
9730: 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
9740: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  nce improvement 
9750: 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65  on windows where
9760: 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69   opening.** a fi
9770: 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69  le is an expensi
9780: 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ve operation..*/
9790: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
97a0: 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
97b0: 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
97c0: 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b   int hasMaster){
97d0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
97e0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
97f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9800: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
9810: 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
9820: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9830: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
9840: 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
9850: 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  int(pPager);.  i
9860: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
9870: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66  alOpen ){.    if
9880: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
9890: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
98a0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
98b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d  ){.      int isM
98c0: 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 3d 20 73  emoryJournal = s
98d0: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
98e0: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  al(pPager->jfd);
98f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
9900: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
9910: 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  d);.      pPager
9920: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
9930: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  0;.      if( !is
9940: 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b  MemoryJournal ){
9950: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
9960: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
9970: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
9980: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
9990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
99a0: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
99b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
99c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
99d0: 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20  RUNCATE.        
99e0: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
99f0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
9a00: 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51  er->jfd, 0))==SQ
9a10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9a20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9a30: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
9a40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
9a50: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d  arted = 0;.    }
9a60: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
9a70: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
9a80: 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
9a90: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9aa0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
9ab0: 45 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20  ERSIST.    ){.  
9ac0: 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75      rc = zeroJou
9ad0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
9ae0: 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  hasMaster);.    
9af0: 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
9b00: 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
9b10: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9b20: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
9b30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
9b40: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d  arted = 0;.    }
9b50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
9b60: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
9b70: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9b80: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
9b90: 45 20 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20 20  E || rc );.     
9ba0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
9bb0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
9bc0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
9bd0: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
9be0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9bf0: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
9c00: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
9c10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9c20: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
9c30: 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
9c40: 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
9c50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9c60: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
9c70: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
9c80: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
9c90: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
9ca0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
9cb0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
9cc0: 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
9cd0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 70 50 61  llback);.    pPa
9ce0: 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
9cf0: 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66  back = 0;.#ifdef
9d00: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
9d10: 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50  GES.    sqlite3P
9d20: 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
9d30: 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
9d40: 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
9d50: 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20  ehash);.#endif. 
9d60: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
9d70: 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
9d80: 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 70  >pPCache);.    p
9d90: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
9da0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
9db0: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
9dc0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
9dd0: 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
9de0: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  rnal==0 );.  }..
9df0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
9e00: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
9e10: 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f      rc2 = osUnlo
9e20: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
9e30: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
9e40: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
9e50: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
9e60: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
9e70: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
9e80: 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50  SYNCED ){.    pP
9e90: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
9ea0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
9eb0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f   }.  pPager->dbO
9ec0: 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  rigSize = 0;.  p
9ed0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9ee0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
9ef0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
9f00: 2f 2a 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72  /* lruListSetFir
9f10: 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29  stSynced(pPager)
9f20: 3b 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44  ; */.  if( !MEMD
9f30: 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
9f40: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
9f50: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
9f60: 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a  dbModified = 0;.
9f70: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
9f80: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
9f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
9fa0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
9fb0: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
9fc0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
9fd0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
9fe0: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
9ff0: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
a000: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
a010: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
a020: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
a030: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
a040: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
a050: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
a060: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
a070: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
a080: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
a090: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
a0a0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
a0b0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
a0c0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
a0d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
a0e0: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
a0f0: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
a100: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
a110: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
a120: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
a130: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
a140: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
a150: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
a160: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
a170: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
a180: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
a190: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
a1a0: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
a1b0: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
a1c0: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
a1d0: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
a1e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
a1f0: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
a200: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
a210: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
a220: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
a230: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
a240: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
a250: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
a260: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
a270: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
a280: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
a290: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
a2a0: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
a2b0: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
a2c0: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
a2d0: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
a2e0: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
a2f0: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
a300: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
a310: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
a320: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
a330: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
a340: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
a350: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
a360: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
a370: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
a380: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
a390: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
a3a0: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
a3b0: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
a3c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
a3d0: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
a3e0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
a3f0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
a400: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
a410: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
a420: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
a430: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
a440: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
a450: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
a460: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
a470: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
a480: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  page from the jo
a490: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65  urnal file opene
a4a0: 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  d on file descri
a4b0: 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c  ptor.** jfd.  Pl
a4c0: 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20  ayback this one 
a4d0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
a4e0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20  isMainJrnl flag 
a4f0: 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73 20  is true if this 
a500: 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  is the main roll
a510: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
a520: 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68  .** false for th
a530: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
a540: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72  nal.  The main r
a550: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
a560: 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d  uses.** checksum
a570: 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
a580: 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  t journal does n
a590: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
a5a0: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
a5b0: 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
a5c0: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
a5d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a5e0: 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
a5f0: 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
a600: 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a620: 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
a630: 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
a640: 6e 61 6c 2e 20 2a 2f 0a 20 20 69 36 34 20 6f 66  nal. */.  i64 of
a650: 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
a660: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
a670: 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
a680: 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  layback */.  int
a690: 20 69 73 53 61 76 65 70 6e 74 2c 20 20 20 20 20   isSavepnt,     
a6a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a6b0: 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
a6c0: 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  nt rollback */. 
a6d0: 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 20   Bitvec *pDone  
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a6f0: 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
a700: 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
a710: 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e   back */.){.  in
a720: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
a730: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
a740: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
a750: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
a760: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
a770: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
a780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a790: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
a7a0: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
a7b0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
a7c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a7d0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
a7e0: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
a7f0: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
a800: 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a  8 *aData = (u8 *
a810: 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
a820: 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74  ce;   /* Temp st
a830: 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65  orage for a page
a840: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
a850: 6c 65 20 2a 6a 66 64 20 3d 20 28 69 73 4d 61 69  le *jfd = (isMai
a860: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
a870: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
a880: 66 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  fd);..  /* The t
a890: 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
a8a0: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74   be allocated at
a8b0: 20 74 68 69 73 20 70 6f 69 6e 74 20 2a 2f 0a 20   this point */. 
a8c0: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
a8d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61  ;.  assert( isMa
a8e0: 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20  inJrnl || pDone 
a8f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  );.  assert( isS
a900: 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
a910: 3d 30 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65  =0 );..  rc = re
a920: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66  ad32bits(jfd, of
a930: 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
a940: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a950: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
a960: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a970: 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20  ead(jfd, aData, 
a980: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a990: 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69  , offset+4);.  i
a9a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a9b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a9c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a9d0: 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
a9e0: 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f  geSize + 4;..  /
a9f0: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
aa00: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
aa10: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
aa20: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
aa30: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
aa40: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
aa50: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
aa60: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
aa70: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
aa80: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
aa90: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
aaa0: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
aab0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
aac0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
aad0: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
aae0: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
aaf0: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
ab00: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
ab10: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
ab20: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
ab30: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
ab40: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
ab50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
ab60: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
ab70: 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
ab80: 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
ab90: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
aba0: 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
abb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
abc0: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
abd0: 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
abe0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
abf0: 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70 50 61 67  jfd, offset+pPag
ac00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
ac10: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
ac20: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
ac30: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
ac40: 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
ac50: 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
ac60: 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
ac70: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
ac80: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
ac90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
aca0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  E;.    }.  }.  i
acb0: 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
acc0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
acd0: 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
ace0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
acf0: 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
ad00: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
ad10: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
ad20: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
ad30: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
ad40: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
ad50: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
ad60: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
ad70: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
ad80: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
ad90: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
ada0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
adb0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
adc0: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
add0: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
ade0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
adf0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
ae00: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
ae10: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
ae20: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
ae30: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
ae40: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
ae50: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
ae60: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
ae70: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
ae80: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
ae90: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
aea0: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
aeb0: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
aec0: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
aed0: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
aee0: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
aef0: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
af00: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
af10: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
af20: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
af30: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
af40: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
af50: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
af60: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
af70: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
af80: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
af90: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
afa0: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
afb0: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
afc0: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
afd0: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
afe0: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
aff0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
b000: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
b010: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
b020: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
b030: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
b040: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b050: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
b060: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
b070: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
b080: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
b090: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
b0a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
b0b0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
b0c0: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
b0d0: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
b0e0: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
b0f0: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
b100: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
b110: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
b120: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
b130: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
b140: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
b150: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
b160: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
b170: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
b180: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
b190: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
b1a0: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
b1b0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
b1c0: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
b1d0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
b1e0: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
b1f0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
b200: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
b210: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
b220: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
b230: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
b240: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
b250: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
b260: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
b270: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
b280: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
b290: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
b2a0: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
b2b0: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
b2c0: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
b2d0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
b2e0: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
b2f0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
b300: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
b310: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
b320: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
b330: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
b340: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
b350: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
b360: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
b370: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
b380: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
b390: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
b3a0: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
b3b0: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
b3c0: 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
b3d0: 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
b3e0: 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
b3f0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
b400: 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
b410: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
b420: 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
b430: 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
b440: 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
b450: 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
b460: 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
b470: 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
b480: 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
b490: 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
b4a0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
b4b0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
b4c0: 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 35  );.  PAGERTRACE5
b4d0: 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
b4e0: 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
b4f0: 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
b500: 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
b510: 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
b520: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
b530: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61  ger->pageSize, a
b540: 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20  Data),.         
b550: 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e        (isMainJrn
b560: 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22  l?"main-journal"
b570: 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a  :"sub-journal").
b580: 20 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67    );.  if( (pPag
b590: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
b5a0: 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26  _EXCLUSIVE).   &
b5b0: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  & (pPg==0 || 0==
b5c0: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
b5d0: 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20  R_NEED_SYNC)).  
b5e0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 66 64 2d   && (pPager->fd-
b5f0: 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 29 7b 0a  >pMethods).  ){.
b600: 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
b610: 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
b620: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
b630: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b640: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
b650: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
b660: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
b670: 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
b680: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
b690: 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
b6a0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
b6b0: 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d   pgno;.    }.  }
b6c0: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
b6d0: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
b6e0: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
b6f0: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
b700: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
b710: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
b720: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
b730: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
b740: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
b750: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
b760: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
b770: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
b780: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
b790: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
b7a0: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
b7b0: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
b7c0: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
b7d0: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
b7e0: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
b7f0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
b800: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
b810: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
b820: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
b830: 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
b840: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
b850: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
b860: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
b870: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
b880: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
b890: 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
b8a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
b8b0: 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
b8c0: 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 50 61 67  sSavepnt || pPag
b8d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 3d  er->journalOff<=
b8e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
b8f0: 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
b900: 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
b910: 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
b920: 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
b930: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
b940: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
b950: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
b960: 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
b970: 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
b980: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
b990: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
b9a0: 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
b9b0: 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
b9c0: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
b9d0: 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
b9e0: 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
b9f0: 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
ba00: 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
ba10: 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20   the..      **. 
ba20: 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
ba30: 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74   one exception t
ba40: 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20  o this rule. If 
ba50: 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
ba60: 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a  g rolled.      *
ba70: 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f  * back as part o
ba80: 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f  f a savepoint (o
ba90: 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c  r statement) rol
baa0: 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20  lback from an . 
bab0: 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64       ** unsynced
bac0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
bad0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
bae0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  e, then it is no
baf0: 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20  t safe.      ** 
bb00: 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  to mark the page
bb10: 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20   as clean. This 
bb20: 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69  is because marki
bb30: 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20  ng the page as. 
bb40: 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69       ** clean wi
bb50: 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  ll clear the PGH
bb60: 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
bb70: 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  g. Since the pag
bb80: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c  e is.      ** al
bb90: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
bba0: 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72  rnal file (recor
bbb0: 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  ded in Pager.pIn
bbc0: 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20  Journal) and.   
bbd0: 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
bbe0: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
bbf0: 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68  s cleared, if th
bc00: 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
bc10: 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67  n to.      ** ag
bc20: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
bc30: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
bc40: 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61  will be marked a
bc50: 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20  s dirty but.    
bc60: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
bc70: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69  EED_SYNC flag wi
bc80: 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49  ll not be set. I
bc90: 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74  t could then pot
bca0: 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a  entially.      *
bcb0: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  * be written out
bcc0: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
bcd0: 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69  se file before i
bce0: 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ts journal file.
bcf0: 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
bd00: 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61   is synced. If a
bd10: 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75   crash occurs du
bd20: 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  ring or followin
bd30: 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a  g this,.      **
bd40: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
bd50: 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a  tion may ensue..
bd60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
bd70: 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
bd80: 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
bd90: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
bda0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
bdb0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
bdc0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
bdd0: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
bde0: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
bdf0: 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
be00: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
be10: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
be20: 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
be30: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
be40: 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
be50: 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
be60: 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
be70: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
be80: 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
be90: 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
bea0: 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
beb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
bec0: 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
bed0: 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
bee0: 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
bef0: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
bf00: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  ->pgno, 3);.    
bf10: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
bf20: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
bf30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bf40: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
bf50: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
bf60: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
bf70: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
bf80: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
bf90: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
bfa0: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
bfb0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
bfc0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
bfd0: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
bfe0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
bff0: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
c000: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
c010: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c020: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
c030: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
c040: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
c050: 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
c060: 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
c070: 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
c080: 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
c090: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
c0a0: 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
c0b0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  tion..**.**.** T
c0c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c0d0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
c0e0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
c0f0: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
c100: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
c110: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c120: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
c130: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
c140: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
c150: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
c160: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
c170: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
c180: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
c190: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
c1a0: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
c1b0: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
c1c0: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
c1d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
c1e0: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
c1f0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
c200: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
c210: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
c220: 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
c230: 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
c240: 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f  ;.  int master_o
c250: 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  pen = 0;.  sqlit
c260: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
c270: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
c280: 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68   *pJournal;.  ch
c290: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
c2a0: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
c2b0: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
c2c0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
c2d0: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
c2e0: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
c2f0: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
c300: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
c310: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
c320: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
c330: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
c340: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
c350: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
c360: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
c370: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
c380: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
c390: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
c3a0: 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
c3b0: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
c3c0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70  )sqlite3Malloc(p
c3d0: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
c3e0: 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
c3f0: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
c400: 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
c410: 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
c420: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
c430: 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
c440: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c450: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66  }else{.    int f
c460: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
c470: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
c480: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
c490: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
c4a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
c4b0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
c4c0: 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
c4d0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
c4e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
c4f0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
c500: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
c510: 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 1;..  rc = sql
c520: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
c530: 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
c540: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
c550: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
c560: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
c570: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
c580: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
c590: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
c5a0: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
c5b0: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
c5c0: 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
c5d0: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
c5e0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
c5f0: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
c600: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
c610: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
c620: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
c630: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
c640: 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
c650: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
c660: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
c670: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
c680: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
c690: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
c6a0: 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
c6b0: 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
c6c0: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
c6d0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
c6e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c6f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
c700: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
c710: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74  .    }.    zMast
c720: 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
c730: 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
c740: 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20  ournal];.    rc 
c750: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
c760: 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
c770: 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
c780: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
c790: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
c7a0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
c7b0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
c7c0: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
c7d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
c7e0: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
c7f0: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
c800: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
c810: 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  l ){.      int e
c820: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20  xists;.      rc 
c830: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
c840: 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
c850: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
c860: 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
c870: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c880: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c890: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
c8a0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
c8b0: 0a 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74  .      if( exist
c8c0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  s ){.        /* 
c8d0: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
c8e0: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
c8f0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
c900: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
c910: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
c920: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
c930: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
c940: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
c950: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
c960: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
c970: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
c980: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
c990: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
c9a0: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
c9b0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
c9c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
c9d0: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
c9e0: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
c9f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ca00: 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
ca10: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
ca20: 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
ca30: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
ca40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ca50: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
ca60: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
ca70: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
ca80: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
ca90: 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
caa0: 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
cab0: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
cac0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
cad0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
cae0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
caf0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
cb00: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
cb10: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
cb20: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
cb30: 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
cb40: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
cb50: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
cb60: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
cb70: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
cb80: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
cb90: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
cba0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cbb0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
cbc0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
cbd0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
cbe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
cbf0: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
cc00: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
cc10: 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
cc20: 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71    }.  .  rc = sq
cc30: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
cc40: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
cc50: 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
cc60: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
cc70: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
cc80: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
cc90: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
cca0: 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70  .  if( master_op
ccb0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
ccc0: 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
ccd0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
cce0: 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
ccf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cd00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
cd10: 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
cd20: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
cd30: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  ;../*.** Truncat
cd40: 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20  e the main file 
cd50: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  of the given pag
cd60: 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  er to the number
cd70: 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64   of pages.** ind
cd80: 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75  icated. Also tru
cd90: 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 64  ncate the cached
cda0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
cdb0: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  of the file..**.
cdc0: 2a 2a 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62  ** Might might b
cdd0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
cde0: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
cdf0: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
ce00: 20 6e 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20   nPage..** This 
ce10: 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20  can happen, for 
ce20: 65 78 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61  example, if we a
ce30: 72 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  re in the middle
ce40: 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
ce50: 6e 0a 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65  n.** which has e
ce60: 78 74 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65  xtended the file
ce70: 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65   size and the ne
ce80: 77 20 70 61 67 65 73 20 61 72 65 20 73 74 69 6c  w pages are stil
ce90: 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e  l all held.** in
cea0: 20 63 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20   cache, then an 
ceb0: 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45  INSERT or UPDATE
cec0: 20 64 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e   does a statemen
ced0: 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d  t rollback.  Som
cee0: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
cef0: 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
cf00: 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
cf10: 6e 66 75 73 65 64 20 69 66 20 79 6f 75 20 74 72  nfused if you tr
cf20: 79 20 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65  y to.** truncate
cf30: 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
cf40: 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
cf50: 67 65 72 20 74 68 61 6e 20 69 74 20 63 75 72 72  ger than it curr
cf60: 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20  ently is,.** so 
cf70: 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
cf80: 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
cf90: 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
cfa0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
cfb0: 6e 65 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  new.** file inst
cfc0: 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ead..*/.static i
cfd0: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
cfe0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
cff0: 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
d000: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d010: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
d020: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
d030: 58 43 4c 55 53 49 56 45 20 26 26 20 70 50 61 67  XCLUSIVE && pPag
d040: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
d050: 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
d060: 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
d070: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
d080: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
d090: 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
d0a0: 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
d0b0: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
d0c0: 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
d0d0: 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
d0e0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
d0f0: 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
d100: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
d110: 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
d120: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
d130: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
d140: 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
d150: 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
d160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
d170: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
d180: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
d190: 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
d1a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d1b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d1c0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
d1d0: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
d1e0: 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
d1f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d200: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d210: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
d220: 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
d230: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
d240: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
d250: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
d260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
d270: 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72  e sectorSize for
d280: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
d290: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74  ..**.** The sect
d2a0: 6f 72 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65  or size is at le
d2b0: 61 73 74 20 61 73 20 62 69 67 20 61 73 20 74 68  ast as big as th
d2c0: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65  e sector size re
d2d0: 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  ported.** by sql
d2e0: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
d2f0: 28 29 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d  ().  The minimum
d300: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
d310: 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  512..*/.static v
d320: 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
d330: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
d340: 7b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  {.  assert(pPage
d350: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
d360: 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
d370: 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  e);.  if( !pPage
d380: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
d390: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
d3a0: 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
d3b0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
d3c0: 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
d3d0: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
d3e0: 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
d3f0: 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63  ened yet, in whc
d400: 69 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ih case the OsSe
d410: 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
d420: 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
d430: 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ault..    */.   
d440: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
d450: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
d460: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
d470: 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->fd);.  }.  if(
d480: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
d490: 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70  ize<512 ){.    p
d4a0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
d4b0: 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a  e = 512;.  }.}..
d4c0: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
d4d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
d4e0: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
d4f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
d500: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
d510: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
d520: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
d530: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
d540: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
d550: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
d560: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
d570: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
d580: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
d590: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
d5a0: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
d5b0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
d5c0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
d5d0: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
d5e0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
d5f0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
d600: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
d610: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
d620: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
d630: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
d640: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
d650: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
d660: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
d670: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
d680: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
d690: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
d6a0: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
d6b0: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
d6c0: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
d6d0: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
d6e0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
d6f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
d700: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
d710: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
d720: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
d730: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
d740: 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  5)  4 byte big-e
d750: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
d760: 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f  ich is the secto
d770: 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61  r size.  The hea
d780: 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20  der.**       is 
d790: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
d7a0: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29  in size..**  (6)
d7b0: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
d7c0: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
d7d0: 68 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61  h is the page ca
d7e0: 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62  se..**  (7)  4 b
d7f0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
d800: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
d810: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
d820: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
d830: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
d840: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
d850: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
d860: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
d870: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
d880: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38  journal.).**  (8
d890: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
d8a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d8b0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
d8c0: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
d8d0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
d8e0: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
d8f0: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
d900: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
d910: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
d920: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
d930: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
d940: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
d950: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
d960: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
d970: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
d980: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
d990: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
d9a0: 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  9)  Zero or more
d9b0: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
d9c0: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
d9d0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
d9e0: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
d9f0: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
da00: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
da10: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
da20: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
da30: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
da40: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
da50: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
da60: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
da70: 20 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65   the first 8 ite
da80: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
da90: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
daa0: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
dab0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68  tance of the 9th
dac0: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
dad0: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
dae0: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
daf0: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
db00: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
db10: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
db20: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
db30: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
db40: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
db50: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
db60: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
db70: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
db80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
db90: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
dba0: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
dbb0: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
dbc0: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
dbd0: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
dbe0: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
dbf0: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
dc00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
dc10: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
dc20: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
dc30: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
dc40: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
dc50: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
dc60: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
dc70: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
dc80: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
dc90: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
dca0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
dcb0: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
dcc0: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
dcd0: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
dce0: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
dcf0: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
dd00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
dd10: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
dd20: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
dd30: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
dd40: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
dd50: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
dd60: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
dd70: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
dd80: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
dd90: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
dda0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
ddb0: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
ddc0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
ddd0: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
dde0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
ddf0: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
de00: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
de10: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
de20: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
de30: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
de40: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
de50: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
de60: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
de70: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
de80: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
de90: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
dea0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
deb0: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
dec0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
ded0: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
dee0: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
def0: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
df00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
df10: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
df20: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
df30: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
df40: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
df50: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
df60: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
df70: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
df80: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
df90: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
dfa0: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
dfb0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
dfc0: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
dfd0: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
dfe0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
dff0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
e000: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
e010: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
e020: 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
e030: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
e040: 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
e050: 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
e060: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
e070: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
e080: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
e090: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
e0a0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
e0b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e0c0: 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
e0d0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
e0e0: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
e0f0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
e100: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
e110: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
e120: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
e130: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
e140: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
e150: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
e160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e170: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
e180: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
e190: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
e1a0: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
e1b0: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
e1c0: 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
e1d0: 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
e1e0: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
e1f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
e200: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e210: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
e220: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
e230: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
e240: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
e250: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
e260: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
e270: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
e280: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
e290: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
e2a0: 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
e2b0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
e2c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
e2d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e2e0: 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20  TE_OK || szJ==0 
e2f0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
e300: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
e310: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
e320: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
e330: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
e340: 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
e350: 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
e360: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e370: 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
e380: 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
e390: 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
e3a0: 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
e3b0: 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
e3c0: 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
e3d0: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
e3e0: 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
e3f0: 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  back..  */.  zMa
e400: 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
e410: 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
e420: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
e430: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
e440: 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
e450: 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
e460: 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
e470: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
e480: 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
e490: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
e4a0: 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
e4b0: 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
e4c0: 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
e4d0: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
e4e0: 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
e4f0: 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
e500: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
e510: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
e520: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e530: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
e540: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
e550: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
e560: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
e570: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
e580: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
e590: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
e5a0: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
e5b0: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
e5c0: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
e5d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
e5e0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
e5f0: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
e600: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
e610: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
e620: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
e630: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
e640: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
e650: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
e660: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
e670: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
e680: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
e690: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
e6a0: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
e6b0: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
e6c0: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
e6d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
e6e0: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
e6f0: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
e700: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
e710: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e720: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
e730: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
e740: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e750: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
e760: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
e770: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
e780: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
e790: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
e7a0: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
e7b0: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
e7c0: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
e7d0: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
e7e0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
e7f0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
e800: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e810: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
e820: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
e830: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
e840: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
e850: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
e860: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
e870: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
e880: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
e890: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e8a0: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
e8b0: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
e8c0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
e8d0: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
e8e0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
e8f0: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
e900: 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
e910: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
e920: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
e930: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
e940: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
e950: 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
e960: 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
e970: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
e980: 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
e990: 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
e9a0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
e9b0: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
e9c0: 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
e9d0: 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
e9e0: 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
e9f0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
ea00: 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
ea10: 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
ea20: 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
ea30: 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
ea40: 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
ea50: 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
ea60: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
ea70: 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
ea80: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
ea90: 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
eaa0: 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
eab0: 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
eac0: 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
ead0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
eae0: 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
eaf0: 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
eb00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
eb10: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
eb20: 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
eb30: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
eb40: 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
eb50: 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
eb60: 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
eb70: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
eb80: 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
eb90: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
eba0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
ebb0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
ebc0: 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
ebd0: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
ebe0: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
ebf0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
ec00: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
ec10: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
ec20: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
ec30: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
ec40: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
ec50: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
ec60: 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
ec70: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ec80: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
ec90: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
eca0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
ecb0: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
ecc0: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
ecd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
ece0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
ecf0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
ed00: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
ed10: 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
ed20: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
ed30: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
ed40: 65 28 70 50 61 67 65 72 2c 20 31 2c 20 70 50 61  e(pPager, 1, pPa
ed50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
ed60: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
ed70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ed80: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
ed90: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
eda0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
edb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
edc0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
edd0: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
ede0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
edf0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ee00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ee10: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
ee20: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
ee30: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
ee40: 70 72 6f 62 61 62 6c 79 0a 20 20 20 20 20 20 20  probably.       
ee50: 20 20 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20 65     ** going to e
ee60: 6e 64 20 75 70 20 62 65 69 6e 67 20 63 6f 72 72  nd up being corr
ee70: 75 70 74 2e 20 20 49 74 20 69 73 20 63 6f 72 72  upt.  It is corr
ee80: 75 70 74 20 74 6f 20 75 73 2c 20 61 6e 79 68 6f  upt to us, anyho
ee90: 77 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  w..          ** 
eea0: 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
eeb0: 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
eec0: 20 61 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20 69   along can fix i
eed0: 74 2e 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20  t.....          
eee0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
eef0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
ef00: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
ef10: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
ef20: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
ef30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ef40: 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
ef50: 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
ef60: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
ef70: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ef80: 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
ef90: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
efa0: 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
efb0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
efc0: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
efd0: 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
efe0: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
eff0: 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  +1);.  }.  if( r
f000: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f010: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
f020: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
f030: 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
f040: 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20  ]!='\0');.  }.  
f050: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f060: 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
f070: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a  && res ){.    /*
f080: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
f090: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
f0a0: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
f0b0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
f0c0: 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
f0d0: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
f0e0: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
f0f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
f100: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
f110: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
f120: 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
f130: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
f140: 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
f150: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
f160: 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
f170: 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
f180: 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
f190: 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
f1a0: 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
f1b0: 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
f1c0: 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
f1d0: 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
f1e0: 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
f1f0: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
f200: 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
f210: 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
f220: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f230: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 61 20 73  .** Playback a s
f240: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
f250: 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
f260: 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
f270: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
f280: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
f290: 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
f2a0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
f2b0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f2c0: 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
f2d0: 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  l */.  i64 iHdrO
f2e0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
f2f0: 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20  /* End of first 
f300: 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d  segment of main-
f310: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
f320: 2a 2f 0a 20 20 50 67 6e 6f 20 69 69 3b 20 20 20  */.  Pgno ii;   
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f340: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
f350: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f370: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
f380: 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20  Bitvec *pDone = 
f390: 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76  0;       /* Bitv
f3a0: 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67  ec to ensure pag
f3b0: 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  es played back o
f3c0: 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 2f  nly once */..  /
f3d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
f3e0: 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
f3f0: 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
f400: 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
f410: 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
f420: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
f430: 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
f440: 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
f450: 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
f460: 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
f470: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f480: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
f490: 20 7d 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74   }..  /* Truncat
f4a0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
f4b0: 61 63 6b 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ack to the size 
f4c0: 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
f4d0: 65 20 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e  e .  ** savepoin
f4e0: 74 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  t being reverted
f4f0: 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
f500: 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  /.  rc = pager_t
f510: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
f520: 70 53 61 76 65 70 6f 69 6e 74 3f 70 53 61 76 65  pSavepoint?pSave
f530: 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 3a 70 50 61  point->nOrig:pPa
f540: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
f550: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
f560: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
f570: 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
f580: 20 4e 6f 77 20 72 6f 6c 6c 20 62 61 63 6b 20 61   Now roll back a
f590: 6c 6c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ll main journal 
f5a0: 66 69 6c 65 20 72 65 63 6f 72 64 73 20 74 68 61  file records tha
f5b0: 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 62 79  t occur after by
f5c0: 74 65 0a 20 20 2a 2a 20 62 79 74 65 20 6f 66 66  te.  ** byte off
f5d0: 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69  set PagerSavepoi
f5e0: 6e 74 2e 69 4f 66 66 73 65 74 20 74 68 61 74 20  nt.iOffset that 
f5f0: 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
f600: 65 72 20 6c 65 73 73 20 74 68 61 6e 0a 20 20 2a  er less than.  *
f610: 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  * or equal to Pa
f620: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
f630: 69 67 2e 20 41 73 20 65 61 63 68 20 72 65 63 6f  ig. As each reco
f640: 72 64 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  rd is played bac
f650: 6b 2c 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  k,.  ** the corr
f660: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
f670: 20 62 69 74 76 65 63 20 50 61 67 65 72 53 61 76   bitvec PagerSav
f680: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
f690: 69 6e 74 20 69 73 20 0a 20 20 2a 2a 20 63 6c 65  int is .  ** cle
f6a0: 61 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  ared..  */.  szJ
f6b0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
f6c0: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 70 53 61  alOff;.  if( pSa
f6d0: 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69  vepoint ){.    i
f6e0: 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
f6f0: 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
f700: 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
f710: 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
f720: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
f730: 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
f740: 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
f750: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
f760: 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
f770: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
f780: 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
f790: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
f7a0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
f7b0: 72 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  r, 1, pPager->jo
f7c0: 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f  urnalOff, 1, pDo
f7d0: 6e 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ne);.      asser
f7e0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
f7f0: 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  NE );.    }.  }e
f800: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
f810: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
f820: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 72 63  .  }.  while( rc
f830: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
f840: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f850: 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  f<szJ ){.    u32
f860: 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20   nJRec;         
f870: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
f880: 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
f890: 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
f8a0: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
f8b0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
f8c0: 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
f8d0: 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
f8e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
f8f0: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   );.    if( nJRe
f900: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a  c==0 ){.      nJ
f910: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
f920: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
f930: 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65   / (pPager->page
f940: 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20  Size+8);.    }. 
f950: 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
f960: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
f970: 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72  <nJRec && pPager
f980: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
f990: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
f9a0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
f9b0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
f9c0: 65 72 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a  er, 1, pPager->j
f9d0: 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44  ournalOff, 1, pD
f9e0: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  one);.      asse
f9f0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
fa00: 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ONE );.    }.  }
fa10: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
fa20: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
fa30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
fa40: 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77  szJ );..  /* Now
fa50: 20 72 6f 6c 6c 20 62 61 63 6b 20 70 61 67 65 73   roll back pages
fa60: 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
fa70: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 66 28 20  urnal. */.  if( 
fa80: 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
fa90: 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
faa0: 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
fab0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
fac0: 69 3c 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  i<pPager->stmtNR
fad0: 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ec; ii++){.     
fae0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 69 69   i64 offset = ii
faf0: 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
fb00: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20  Size);.      rc 
fb10: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
fb20: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
fb30: 2c 20 30 2c 20 6f 66 66 73 65 74 2c 20 31 2c 20  , 0, offset, 1, 
fb40: 70 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61 73  pDone);.      as
fb50: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
fb60: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20  _DONE );.    }. 
fb70: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
fb80: 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
fb90: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
fba0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
fbb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fbc0: 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65   = szJ;.  }.  re
fbd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
fbe0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
fbf0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
fc00: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
fc10: 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
fc20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fc30: 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
fc40: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
fc50: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
fc60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
fc70: 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
fc80: 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
fc90: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  e);.}../*.** Adj
fca0: 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
fcb0: 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
fcc0: 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
fcd0: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
fce0: 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
fcf0: 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
fd00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
fd10: 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
fd20: 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
fd30: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
fd40: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
fd50: 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
fd60: 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
fd70: 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
fd80: 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
fd90: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
fda0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
fdb0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
fdc0: 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
fdd0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
fde0: 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
fdf0: 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
fe00: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
fe10: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
fe20: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
fe30: 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
fe40: 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
fe50: 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
fe60: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
fe70: 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
fe80: 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
fe90: 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
fea0: 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
feb0: 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
fec0: 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
fed0: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
fee0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
ff00: 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
ff10: 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
ff20: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
ff30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ff40: 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
ff50: 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
ff60: 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
ff70: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
ff80: 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
ff90: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
ffa0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
ffb0: 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
ffc0: 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
ffd0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
ffe0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
fff0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
10000 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
10010 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
10020 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
10030 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
10040 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
10050 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
10060 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
10080 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
10090 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
100a0 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
100b0 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
100c0 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
100d0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
100e0 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
100f0 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
10100 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
10110 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
10120 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
10130 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
10140 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ck..**.** Numeri
10150 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
10160 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
10170 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
10180 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
10190 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
101a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
101b0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
101c0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
101d0 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
101e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
101f0 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46  nt level, int bF
10200 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61  ullFsync){.  pPa
10210 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28  ger->noSync =  (
10220 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
10230 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
10240 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
10250 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d  llSync = (level=
10260 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
10270 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
10280 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
10290 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e  ags = (bFullFsyn
102a0 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  c?SQLITE_SYNC_FU
102b0 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  LL:SQLITE_SYNC_N
102c0 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50  ORMAL);.  if( pP
102d0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
102e0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
102f0 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
10300 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
10310 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
10320 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
10330 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
10340 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
10350 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
10360 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
10370 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
10380 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
10390 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
103a0 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
103b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
103c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
103d0 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
103e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
103f0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
10400 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69  file. .**.** Wri
10410 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
10420 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
10430 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
10440 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
10450 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
10460 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
10470 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
10480 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
10490 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
104a0 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65  rary.** file whe
104b0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
104c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
104d0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
104e0 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
104f0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
10500 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
10510 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
10520 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
10530 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
10540 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
10550 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
10560 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
10570 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
10580 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
10590 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64  .  int rc;..#ifd
105a0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
105b0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
105c0 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
105d0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
105e0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
105f0 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
10600 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
10610 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
10620 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
10630 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
10640 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10650 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
10660 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
10670 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
10680 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
10690 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
106a0 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
106b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
106c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46  =SQLITE_OK || pF
106d0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  ile->pMethods );
106e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
106f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10700 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 2c 50  rStress(void *,P
10710 67 48 64 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  gHdr *);../*.** 
10720 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
10730 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20  e cache and put 
10740 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
10750 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a   page cache in *
10760 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  ppPager..** The 
10770 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
10780 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74  d need not exist
10790 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  .  The file is n
107a0 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a  ot locked until.
107b0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ** the first cal
107c0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
107d0 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  rGet() and is on
107e0 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
107f0 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
10800 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
10810 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
10820 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a  erUnref()..**.**
10830 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
10840 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
10850 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
10860 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
10870 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
10880 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
10890 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65   be cached.  The
108a0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
108b0 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
108c0 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69  ically when it i
108d0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
108e0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
108f0 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
10900 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
10910 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
10920 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72  ..** It is never
10930 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
10940 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
10950 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
10960 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79   an.** in-memory
10970 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
10980 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
10990 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
109a0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
109b0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
109c0 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
109d0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
109e0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
109f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
10a00 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
10a10 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
10a20 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
10a30 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
10a40 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
10a50 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
10a60 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
10a70 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
10a80 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
10a90 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
10aa0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ac0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
10ad0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
10ae0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
10af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
10b00 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
10b10 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
10b20 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
10b30 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
10b40 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
10b50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10b60 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
10b70 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
10b80 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
10b90 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
10ba0 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  nly = 0;.  int u
10bb0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
10bc0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
10bd0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69  JOURNAL)==0;.  i
10be0 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
10bf0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
10c00 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a  O_READLOCK)!=0;.
10c10 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
10c20 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 70 63 61  eSize;.  int pca
10c30 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
10c40 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 0a 20  3PcacheSize();. 
10c50 20 69 6e 74 20 73 7a 50 61 67 65 44 66 6c 74 20   int szPageDflt 
10c60 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
10c70 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68  _PAGE_SIZE;.  ch
10c80 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
10c90 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  0;.  int nPathna
10ca0 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 73  me = 0;..  if( s
10cb0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
10cc0 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
10cd0 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
10ce0 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
10cf0 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  leSize = sqlite3
10d00 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
10d10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10d20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
10d30 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  = sqlite3MemJour
10d40 6e 61 6c 53 69 7a 65 28 29 3b 0a 20 20 7d 0a 0a  nalSize();.  }..
10d50 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
10d60 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c   return is a NUL
10d70 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a  L pointer */.  *
10d80 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
10d90 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
10da0 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
10db0 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
10dc0 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
10dd0 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
10de0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
10df0 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
10e00 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
10e10 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
10e20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
10e30 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
10e40 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
10e50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
10e60 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
10e70 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61  me[0] ){.    nPa
10e80 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
10e90 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
10ea0 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
10eb0 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68  ite3Malloc(nPath
10ec0 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
10ed0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
10ee0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10ef0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10f00 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
10f10 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
10f20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
10f30 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
10f40 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
10f50 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
10f60 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
10f70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  0;.    }else.#en
10f80 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
10f90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
10fa0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
10fb0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
10fc0 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
10fd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
10fe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10ff0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11000 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
11010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
11020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 74  ;.    }.    nPat
11030 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
11040 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
11050 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  e);.  }..  /* Al
11060 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
11070 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  r the pager stru
11080 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67 65  cture */.  pPage
11090 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r = sqlite3Mallo
110a0 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65 6f  cZero(.    sizeo
110b0 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20 20  f(*pPager) +    
110c0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
110d0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
110e0 20 70 63 61 63 68 65 53 69 7a 65 20 20 20 20 20   pcacheSize     
110f0 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
11100 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
11110 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
11120 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20 20 20  Size +          
11130 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
11140 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 2a  file structure *
11150 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f  / .    pVfs->szO
11160 73 46 69 6c 65 20 20 2b 20 20 20 20 20 20 20 20  sFile  +        
11170 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
11180 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f  b file */.    jo
11190 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20  urnalFileSize * 
111a0 32 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  2 +       /* The
111b0 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
111c0 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a 6e 50 61  es */ .    3*nPa
111d0 74 68 6e 61 6d 65 20 2b 20 34 30 20 20 20 20 20  thname + 40     
111e0 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
111f0 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c  ame, zDirectory,
11200 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29   zJournal */.  )
11210 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20  ;.  if( !pPager 
11220 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
11230 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
11240 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11250 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
11260 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
11270 20 28 50 43 61 63 68 65 20 2a 29 26 70 50 61 67   (PCache *)&pPag
11280 65 72 5b 31 5d 3b 0a 20 20 70 50 74 72 20 3d 20  er[1];.  pPtr = 
11290 28 28 75 38 20 2a 29 26 70 50 61 67 65 72 5b 31  ((u8 *)&pPager[1
112a0 5d 29 20 2b 20 70 63 61 63 68 65 53 69 7a 65 3b  ]) + pcacheSize;
112b0 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
112c0 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
112d0 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 28    pPager->fd = (
112e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
112f0 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
11300 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d  le*0];.  pPager-
11310 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
11320 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
11330 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d 3b 0a 20 20  s->szOsFile];.  
11340 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73  pPager->jfd = (s
11350 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50  qlite3_file*)&pP
11360 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
11370 65 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  e+journalFileSiz
11380 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e];.  pPager->zF
11390 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
113a0 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
113b0 73 46 69 6c 65 2b 32 2a 6a 6f 75 72 6e 61 6c 46  sFile+2*journalF
113c0 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  ileSize];.  pPag
113d0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d  er->zDirectory =
113e0 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e   &pPager->zFilen
113f0 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
11400 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
11410 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
11420 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74 68  zDirectory[nPath
11430 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65  name+1];.  pPage
11440 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
11450 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
11460 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ){.    memcpy(pP
11470 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
11480 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
11490 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 73 71  hname+1);.    sq
114a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
114b0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  name);.  }..  /*
114c0 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
114d0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
114e0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
114f0 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d  ilename[0] && !m
11500 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28 20  emDb ){.    if( 
11510 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d  nPathname>(pVfs-
11520 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 28 69  >mxPathname - (i
11530 6e 74 29 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72  nt)sizeof("-jour
11540 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20  nal")) ){.      
11550 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
11560 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OPEN;.    }else{
11570 0a 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20  .      int fout 
11580 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
11590 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
115a0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
115b0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
115c0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
115d0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
115e0 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26 66  er->vfsFlags, &f
115f0 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 61 64  out);.      read
11600 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
11610 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
11620 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  Y);..      /* If
11630 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
11640 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
11650 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
11660 20 61 63 63 65 73 73 2c 0a 20 20 20 20 20 20 2a   access,.      *
11670 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75  * choose a defau
11680 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  lt page size in 
11690 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20  case we have to 
116a0 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 20  create the.     
116b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
116c0 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
116d0 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
116e0 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
116f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
11700 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
11710 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
11720 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
11730 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
11740 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
11750 53 69 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  Size().      ** 
11760 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
11770 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
11780 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
11790 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20  tomically..     
117a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
117b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
117c0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
117d0 20 20 20 20 69 6e 74 20 69 53 65 63 74 6f 72 53      int iSectorS
117e0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
117f0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
11800 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
11810 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 69 53  f( szPageDflt<iS
11820 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
11830 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
11840 74 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  t = iSectorSize;
11850 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
11860 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11870 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
11880 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
11890 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
118a0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
118b0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
118c0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ->fd);.         
118d0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
118e0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
118f0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
11900 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
11910 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
11920 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
11930 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
11940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
11950 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
11960 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
11970 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
11980 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
11990 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
119a0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
119b0 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
119c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
119d0 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
119e0 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
119f0 3e 38 29 29 20 29 20 73 7a 50 61 67 65 44 66 6c  >8)) ) szPageDfl
11a00 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
11a10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
11a20 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
11a30 20 73 7a 50 61 67 65 44 66 6c 74 3e 53 51 4c 49   szPageDflt>SQLI
11a40 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
11a50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
11a60 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
11a70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
11a80 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
11a90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11aa0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
11ab0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
11ac0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
11ad0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
11ae0 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
11af0 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
11b00 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
11b10 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
11b20 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
11b30 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
11b40 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
11b50 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
11b60 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
11b70 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
11b80 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
11b90 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e  anch is also run
11ba0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
11bb0 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69  y database. An i
11bc0 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  n-memory.    ** 
11bd0 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20  database is the 
11be0 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66  same as a temp-f
11bf0 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65  ile that is neve
11c00 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  r written out to
11c10 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64  .    ** disk and
11c20 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f   uses an in-memo
11c30 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
11c40 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  nal..    */ .   
11c50 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
11c60 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
11c70 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
11c80 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  VE;.  }..  if( p
11c90 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  Pager && rc==SQL
11ca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
11cb0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
11cc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
11cd0 6c 6f 63 28 73 7a 50 61 67 65 44 66 6c 74 29 3b  loc(szPageDflt);
11ce0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
11cf0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
11d00 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
11d10 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20  blocks above..  
11d20 2a 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65  ** Free the Page
11d30 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
11d40 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
11d50 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70    ** Since the p
11d60 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
11d70 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
11d80 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
11d90 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
11da0 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
11db0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
11dc0 67 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  ger || !pPager->
11dd0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
11de0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11df0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
11e00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
11e10 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
11e20 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
11e30 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
11e40 72 63 29 3b 0a 20 20 7d 0a 20 20 6e 45 78 74 72  rc);.  }.  nExtr
11e50 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  a = FORCE_ALIGNM
11e60 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 73  ENT(nExtra);.  s
11e70 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
11e80 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
11e90 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
11ec0 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
11ed0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
11ee0 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45  PCache);..  PAGE
11ef0 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64  RTRACE3("OPEN %d
11f00 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
11f10 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
11f20 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
11f30 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ame);.  IOTRACE(
11f40 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
11f50 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
11f60 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
11f70 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72  /* Fill in Pager
11f80 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f  .zDirectory[] */
11f90 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
11fa0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50  ->zDirectory, pP
11fb0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
11fc0 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20   nPathname+1);. 
11fd0 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74   for(i=sqlite3St
11fe0 72 6c 65 6e 33 30 28 70 50 61 67 65 72 2d 3e 7a  rlen30(pPager->z
11ff0 44 69 72 65 63 74 6f 72 79 29 3b 20 0a 20 20 20  Directory); .   
12000 20 20 20 69 3e 30 20 26 26 20 70 50 61 67 65 72     i>0 && pPager
12010 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
12020 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
12030 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65   if( i>0 ) pPage
12040 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
12050 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69  1] = 0;..  /* Fi
12060 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75  ll in Pager.zJou
12070 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28 20  rnal[] */.  if( 
12080 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
12090 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
120a0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
120b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
120c0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
120d0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
120e0 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
120f0 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29  , "-journal", 9)
12100 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12110 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
12120 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70  = 0;.  }..  /* p
12130 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
12140 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  en = 0; */.  pPa
12150 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
12160 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
12170 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
12180 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64  adlock = (noRead
12190 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
121a0 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61  ) ?1:0;.  /* pPa
121b0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
121c0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
121d0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
121e0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
121f0 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
12200 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
12210 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62  alid = (u8)memDb
12220 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ;.  pPager->page
12230 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 44 66 6c  Size = szPageDfl
12240 74 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  t;.  /* pPager->
12250 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
12260 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
12270 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
12280 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
12290 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
122a0 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
122b0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  0;.  pPager->mxP
122c0 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
122d0 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
122e0 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
122f0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
12300 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
12310 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
12320 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
12330 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
12340 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
12350 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
12360 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
12370 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
12380 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
12390 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
123a0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
123b0 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
123c0 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
123d0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
123e0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
123f0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
12400 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
12410 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
12420 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
12430 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
12440 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
12450 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
12460 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
12470 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
12480 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
12490 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
124a0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   */.  pPager->no
124b0 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
124c0 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
124d0 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20  Journal) ?1:0;. 
124e0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
124f0 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  c = pPager->noSy
12500 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65  nc ?0:1;.  pPage
12510 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
12520 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
12530 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  AL;.  /* pPager-
12540 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
12550 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
12560 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
12570 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
12580 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
12590 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
125a0 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
125b0 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
125c0 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
125d0 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
125e0 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
125f0 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
12600 74 68 6f 64 73 7c 7c 74 65 6d 70 46 69 6c 65 29  thods||tempFile)
12610 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
12620 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
12630 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
12640 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
12650 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
12660 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
12670 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
12680 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
12690 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
126a0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
126b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65   = 0; */.  /* me
126c0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
126d0 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
126e0 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
126f0 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  /.  *ppPager = p
12700 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
12710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12720 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
12730 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
12740 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
12750 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
12760 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a  ndler(.  Pager *
12770 70 50 61 67 65 72 2c 20 0a 20 20 69 6e 74 20 28  pPager, .  int (
12780 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
12790 6f 69 64 20 2a 29 2c 0a 20 20 76 6f 69 64 20 2a  oid *),.  void *
127a0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 0a  pBusyHandlerArg.
127b0 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78  ){  .  pPager->x
127c0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
127d0 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
127e0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
127f0 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
12800 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  dlerArg;.}../*.*
12810 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
12820 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
12830 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
12840 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74  NULL, the reinit
12850 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61  ializer.** is ca
12860 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  lled when the co
12870 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20  ntent of a page 
12880 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74  in cache is rest
12890 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
128a0 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73  inal.** value as
128b0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72   a result of a r
128c0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61  ollback.  The ca
128d0 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67  llback gives hig
128e0 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a  her-level code.*
128f0 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  * an opportunity
12900 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
12910 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
12920 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
12930 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65  restored.** page
12940 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73   data..*/.void s
12950 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
12960 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50  initer(Pager *pP
12970 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65  ager, void (*xRe
12980 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29 7b  init)(DbPage*)){
12990 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
129a0 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
129b0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
129c0 20 70 61 67 65 20 73 69 7a 65 20 74 6f 20 2a 70   page size to *p
129d0 50 61 67 65 53 69 7a 65 2e 20 49 66 20 74 68 65  PageSize. If the
129e0 20 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67   suggest new pag
129f0 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61  e size is.** ina
12a00 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e  ppropriate, then
12a10 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
12a20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74  page size is set
12a30 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
12a40 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
12a50 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
12a60 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
12a70 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
12a80 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
12a90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
12aa0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
12ab0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12ac0 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61  OK ){.    u16 pa
12ad0 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
12ae0 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
12af0 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
12b00 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
12b10 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
12b20 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
12b30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67  ) );.    if( pag
12b40 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
12b50 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e!=pPager->pageS
12b60 69 7a 65 20 0a 20 20 20 20 20 26 26 20 28 70 50  ize .     && (pP
12b70 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
12b80 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
12b90 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c  ==0).     && sql
12ba0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
12bb0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
12bc0 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20  he)==0 .    ){. 
12bd0 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20       char *pNew 
12be0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
12bf0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
12c00 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
12c10 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !pNew ){.      
12c20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12c30 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
12c40 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
12c50 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12c60 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
12c70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
12c80 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
12c90 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
12ca0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
12cb0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
12cc0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
12cd0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
12ce0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e);.        pPag
12cf0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
12d00 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71  pNew;.        sq
12d10 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
12d20 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
12d30 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
12d40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
12d50 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20  .    *pPageSize 
12d60 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 70  = (u16)pPager->p
12d70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72  ageSize;.  }.  r
12d80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12d90 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
12da0 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
12db0 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
12dc0 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
12dd0 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
12de0 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
12df0 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
12e00 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
12e10 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
12e20 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
12e30 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
12e40 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
12e50 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
12e60 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
12e70 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
12e80 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
12e90 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
12ea0 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
12eb0 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
12ec0 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
12ed0 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
12ee0 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
12ef0 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
12f00 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
12f10 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
12f20 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
12f30 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
12f40 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
12f50 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
12f60 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
12f70 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
12f80 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
12f90 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
12fa0 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
12fb0 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
12fc0 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
12fd0 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
12fe0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
12ff0 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
13000 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
13010 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
13020 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
13030 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
13040 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
13050 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
13060 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
13070 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
13080 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
13090 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
130a0 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
130b0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
130c0 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73   mxPage;.  }.  s
130d0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
130e0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
130f0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
13100 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
13110 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
13120 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
13130 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
13140 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
13150 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
13160 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
13170 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
13180 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
13190 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
131a0 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
131b0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
131c0 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
131d0 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
131e0 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
131f0 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
13200 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
13210 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
13220 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
13230 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
13240 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
13250 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
13260 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
13270 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
13280 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
13290 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
132a0 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
132b0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
132c0 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
132d0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
132e0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
132f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
13300 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
13310 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
13320 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
13330 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
13340 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
13350 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
13360 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
13370 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
13380 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
13390 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
133a0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
133b0 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
133c0 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
133d0 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
133e0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
133f0 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
13400 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
13410 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
13420 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65  .** No error che
13430 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54  cking is done. T
13440 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20  he rational for 
13450 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
13460 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d  s function .** m
13470 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65  ay be called eve
13480 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  n if the file do
13490 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
134a0 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72  contain a header
134b0 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63  . In .** these c
134c0 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65  ases sqlite3OsRe
134d0 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  ad() will return
134e0 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68   an error, to wh
134f0 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ich the correct 
13500 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20  .** response is 
13510 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f  to zero the memo
13520 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20  ry at pDest and 
13530 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61  continue.  A rea
13540 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77  l IO error .** w
13550 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72  ill presumably r
13560 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b  ecur and be pick
13570 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64  ed up later (Tod
13580 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  o: Think about t
13590 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  his)..*/.int sql
135a0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
135b0 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
135c0 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
135d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
135e0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
135f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
13600 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
13610 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
13620 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
13630 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
13640 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
13650 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
13660 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
13670 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
13680 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
13690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
136a0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
136b0 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
136c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
136d0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
136e0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
136f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13700 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
13710 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
13720 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
13730 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
13740 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
13750 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
13760 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   pPager. .**.** 
13770 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42  If the PENDING_B
13780 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20  YTE lies on the 
13790 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66  page directly af
137a0 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
137b0 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  he.** file, then
137c0 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70   consider this p
137d0 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  age part of the 
137e0 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78  file too. For ex
137f0 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e  ample, if.** PEN
13800 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74  DING_BYTE is byt
13810 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73  e 4096 (the firs
13820 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35  t byte of page 5
13830 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  ) and the size o
13840 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  f the.** file is
13850 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69   4096 bytes, 5 i
13860 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
13870 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20  ad of 4..*/.int 
13880 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13890 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
138a0 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
138b0 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a  ){.  i64 n = 0;.
138c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
138d0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
138e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
138f0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
13900 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
13910 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  de;.    return r
13920 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
13930 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
13940 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67   ){.    n = pPag
13950 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20  er->dbSize;.  } 
13960 65 6c 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72  else {.    asser
13970 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
13980 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
13990 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69  tempFile);.    i
139a0 66 28 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( (pPager->fd->
139b0 70 4d 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26  pMethods).     &
139c0 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  & (rc = sqlite3O
139d0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
139e0 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49  ->fd, &n))!=SQLI
139f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
13a00 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
13a10 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
13a20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
13a30 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
13a40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
13a50 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b   ){.      n = 1;
13a60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13a70 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70    n /= pPager->p
13a80 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  ageSize;.    }. 
13a90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
13aa0 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
13ab0 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
13ac0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67  er->dbSize = (Pg
13ad0 6e 6f 29 6e 3b 0a 20 20 20 20 20 20 70 50 61 67  no)n;.      pPag
13ae0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
13af0 20 28 50 67 6e 6f 29 6e 3b 0a 20 20 20 20 20 20   (Pgno)n;.      
13b00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
13b10 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  lid = 1;.    }. 
13b20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e   }.  if( n==(PEN
13b30 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
13b40 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20  ->pageSize) ){. 
13b50 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66     n++;.  }.  if
13b60 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  ( n>pPager->mxPg
13b70 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
13b80 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
13b90 29 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e  )n;.  }.  if( pn
13ba0 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50  Page ){.    *pnP
13bb0 61 67 65 20 3d 20 28 69 6e 74 29 6e 3b 0a 20 20  age = (int)n;.  
13bc0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13bd0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  E_OK;.}../*.** F
13be0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
13bf0 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
13c00 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
13c10 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  er*);../*.** Thi
13c20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
13c30 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  d to truncate th
13c40 65 20 63 61 63 68 65 20 77 68 65 6e 20 61 20 64  e cache when a d
13c50 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72  atabase.** is tr
13c60 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66  uncated.  Drop f
13c70 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c  rom the cache al
13c80 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67  l pages whose pg
13c90 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20  no is.** larger 
13ca0 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
13cb0 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66  ize and is unref
13cc0 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  erenced..**.** R
13cd0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
13ce0 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
13cf0 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
13d00 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74  eroed..**.** Act
13d10 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f  ually, at the po
13d20 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  int this routine
13d30 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77   is called, it w
13d40 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72  ould be.** an er
13d50 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72 65  ror to have a re
13d60 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20  ferenced page.  
13d70 42 75 74 20 72 61 74 68 65 72 20 74 68 61 6e 20  But rather than 
13d80 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70  delete.** that p
13d90 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65  age and guarante
13da0 65 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 73  e a subsequent s
13db0 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d  egfault, it seem
13dc0 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a  s better.** to z
13dd0 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20  ero it and hope 
13de0 74 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75  that we error ou
13df0 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61  t sanely..*/.sta
13e00 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74  tic void pager_t
13e10 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61  runcate_cache(Pa
13e20 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
13e30 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75  sqlite3PcacheTru
13e40 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50  ncate(pPager->pP
13e50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64  Cache, pPager->d
13e60 62 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bSize);.}../*.**
13e70 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
13e80 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e   lock on a file.
13e90 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73    Invoke the bus
13ea0 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
13eb0 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72  e lock.** is cur
13ec0 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
13ed0 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e  able.  Repeat un
13ee0 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
13ef0 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a  lback returns.**
13f00 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
13f10 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
13f20 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
13f30 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
13f40 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
13f50 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
13f60 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
13f70 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
13f80 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
13f90 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
13fa0 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
13fb0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
13fc0 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f  ..  /* The OS lo
13fd0 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  ck values must b
13fe0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
13ff0 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c  e Pager lock val
14000 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ues */.  assert(
14010 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
14020 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
14030 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
14040 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
14050 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
14060 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
14070 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
14080 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
14090 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  he file is curre
140a0 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68  ntly unlocked th
140b0 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74  en the size must
140c0 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20   be unknown */. 
140d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
140e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
140f0 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
14100 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
14110 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
14120 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
14130 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
14140 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
14150 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
14160 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
14170 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
14180 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
14190 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
141a0 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
141b0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
141c0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
141d0 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66  erArg) );.    if
141e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
141f0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
14200 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63  >state = (u8)loc
14210 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54  ktype;.      IOT
14220 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
14230 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f  d\n", pPager, lo
14240 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20  cktype)).    }. 
14250 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
14260 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
14270 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
14280 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
14290 73 20 73 70 65 63 69 66 69 65 64 2e 20 0a 2a 2a  s specified. .**
142a0 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 49 4f  .** Unless an IO
142b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
142c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
142d0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6d 6f  guaranteed to mo
142e0 64 69 66 79 20 74 68 65 20 0a 2a 2a 20 64 61 74  dify the .** dat
142f0 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
14300 66 2e 20 49 66 20 61 6e 20 65 78 63 6c 75 73 69  f. If an exclusi
14310 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 68  ve lock is not h
14320 65 6c 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  eld when this fu
14330 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
14340 6c 65 64 2c 20 6f 6e 65 20 69 73 20 6f 62 74 61  led, one is obta
14350 69 6e 65 64 20 62 65 66 6f 72 65 20 74 72 75 6e  ined before trun
14360 63 61 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  cating the file.
14370 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
14380 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67  agerTruncate(Pag
14390 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
143a0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
143b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
143c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
143d0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
143e0 41 52 45 44 20 29 3b 0a 0a 20 20 73 71 6c 69 74  ARED );..  sqlit
143f0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
14400 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69  (pPager, 0);.  i
14410 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
14420 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
14430 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
14440 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67    }else if( nPag
14450 65 3c 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  e<pPager->dbFile
14460 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Size ){.    rc =
14470 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
14480 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
14490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
144a0 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 65       /* Get an e
144b0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
144c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
144d0 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e  fore truncating.
144e0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
144f0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
14500 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
14510 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  IVE_LOCK);.    }
14520 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14540 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
14550 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67  ate(pPager, nPag
14560 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
14570 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
14580 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14590 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
145a0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
145b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
145c0 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74  ase file image t
145d0 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 55  o nPage pages. U
145e0 6e 6c 69 6b 65 0a 2a 2a 20 73 71 6c 69 74 65 33  nlike.** sqlite3
145f0 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 2c  PagerTruncate(),
14600 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
14610 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
14620 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 64   modify the.** d
14630 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
14640 64 69 73 6b 2e 20 49 74 20 6a 75 73 74 20 73 65  disk. It just se
14650 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
14660 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
14670 65 72 0a 2a 2a 20 6f 62 6a 65 63 74 20 73 6f 20  er.** object so 
14680 74 68 61 74 20 74 68 65 20 74 72 75 6e 63 61 74  that the truncat
14690 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
146a0 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
146b0 74 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  t .** transactio
146c0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
146d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
146e0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
146f0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
14700 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
14710 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14720 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
14730 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14740 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29  >dbSize>=nPage )
14750 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
14760 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  ze = nPage;.}../
14770 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14780 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
14790 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
147a0 65 20 69 6d 61 67 65 20 69 6e 20 70 61 67 65 73  e image in pages
147b0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
147c0 6f 6e 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  on differs from 
147d0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
147e0 63 6f 75 6e 74 28 29 20 69 6e 20 74 77 6f 20 77  count() in two w
147f0 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 61 29 20 49  ays:.**.**  a) I
14800 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  t may only be ca
14810 6c 6c 65 64 20 77 68 65 6e 20 61 74 20 6c 65 61  lled when at lea
14820 73 74 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  st one reference
14830 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 0a 2a   to a database.*
14840 2a 20 20 20 20 20 70 61 67 65 20 69 73 20 68 65  *     page is he
14850 6c 64 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  ld. This guarant
14860 65 65 73 20 74 68 61 74 20 74 68 65 20 64 61 74  ees that the dat
14870 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 61 6c  abase size is al
14880 72 65 61 64 79 0a 2a 2a 20 20 20 20 20 6b 6e 6f  ready.**     kno
14890 77 6e 20 61 6e 64 20 61 20 63 61 6c 6c 20 74 6f  wn and a call to
148a0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
148b0 7a 65 28 29 20 69 73 20 6e 6f 74 20 72 65 71 75  ze() is not requ
148c0 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 62 29 20  ired..**.**  b) 
148d0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
148e0 20 69 73 20 6e 6f 74 20 61 64 6a 75 73 74 65 64   is not adjusted
148f0 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67   for the locking
14900 20 70 61 67 65 2e 0a 2a 2f 0a 50 67 6e 6f 20 73   page..*/.Pgno s
14910 71 6c 69 74 65 33 50 61 67 65 72 49 6d 61 67 65  qlite3PagerImage
14920 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
14930 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
14940 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
14950 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  id );.  return p
14960 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d  Pager->dbSize;.}
14970 0a 23 65 6e 64 69 66 20 20 2f 2a 20 69 66 6e 64  .#endif  /* ifnd
14980 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14990 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a  UTOVACUUM */../*
149a0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
149b0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
149c0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
149d0 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
149e0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
149f0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
14a00 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
14a10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
14a20 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
14a30 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
14a40 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
14a50 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
14a60 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
14a70 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
14a80 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
14a90 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
14aa0 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
14ab0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
14ac0 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
14ad0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
14ae0 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
14af0 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
14b00 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
14b10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
14b20 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
14b30 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
14b40 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
14b50 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
14b60 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
14b70 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
14b80 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
14b90 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
14ba0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
14bb0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
14bc0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
14bd0 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
14be0 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
14bf0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
14c00 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
14c10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14c20 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
14c30 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
14c40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
14c50 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
14c60 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
14c70 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
14c80 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14c90 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
14ca0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
14cb0 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
14cc0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
14cd0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
14ce0 20 20 7d 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d    }.  enable_sim
14cf0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
14d00 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64  ();.  sqlite3End
14d10 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
14d20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43    PAGERTRACE2("C
14d30 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
14d40 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
14d50 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
14d60 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
14d70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
14d80 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
14d90 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
14da0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
14db0 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  }.  sqlite3Bitve
14dc0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
14dd0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
14de0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
14df0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c  troy(pPager->pAl
14e00 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20  waysRollback);. 
14e10 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
14e20 6f 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  oint(pPager);.  
14e30 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
14e40 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a  Pager->fd);.  /*
14e50 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
14e60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
14e70 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
14e80 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
14e90 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
14ea0 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
14eb0 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
14ec0 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
14ed0 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 50 61   */..  sqlite3Pa
14ee0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
14ef0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
14f00 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
14f10 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
14f20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
14f30 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
14f40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14f50 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
14f60 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
14f70 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
14f80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
14f90 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
14fa0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
14fb0 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
14fc0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
14fd0 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
14fe0 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
14ff0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15000 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
15010 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
15020 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  or a page.  The 
15030 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73  input pointer is
15040 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
15050 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61  to the page data
15060 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15070 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
15080 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
15090 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
150a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
150b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
150c0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
150d0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
150e0 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
150f0 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
15100 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
15110 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
15120 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
15130 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
15140 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
15150 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
15160 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
15170 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
15180 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
15190 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
151a0 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
151b0 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
151c0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
151d0 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
151e0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
151f0 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
15200 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
15210 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
15220 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
15230 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
15240 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
15250 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
15260 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
15270 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
15280 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
15290 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
152a0 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
152b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
152c0 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
152d0 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
152e0 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
152f0 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
15300 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
15310 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
15320 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
15330 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
15340 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
15350 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
15360 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
15370 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
15380 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
15390 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
153a0 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
153b0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
153c0 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
153d0 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
153e0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
153f0 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
15400 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
15410 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
15420 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
15430 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
15440 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   no sync occurs.
15450 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f  .**.** If the IO
15460 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66  CAP_SEQUENTIAL f
15470 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 74  lag is set for t
15480 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
15490 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  dia on which.** 
154a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
154b0 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53  stored, then OsS
154c0 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
154d0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  alled on the jou
154e0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e  rnal.** file. In
154f0 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74   this case all t
15500 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
15510 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  is to update the
15520 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a   nRec field in.*
15530 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
15540 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ader..**.** This
15550 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
15560 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
15570 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
15580 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
15590 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
155a0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
155b0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
155c0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
155d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
155e0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
155f0 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
15600 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
15610 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
15620 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
15630 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
15640 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
15650 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
15660 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
15670 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
15680 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15690 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
156a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
156b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
156c0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
156d0 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
156e0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
156f0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
15700 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
15710 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
15720 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20  ournalOpen );.. 
15730 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
15740 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
15750 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
15760 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
15770 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
15780 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
15790 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
157a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
157b0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
157c0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
157d0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
157e0 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
157f0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
15800 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
15810 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
15820 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
15830 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
15840 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
15850 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
15860 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
15870 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
15880 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
15890 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
158a0 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
158b0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
158c0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
158d0 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
158e0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
158f0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
15900 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
15910 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
15920 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
15930 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
15940 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
15950 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
15960 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
15970 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
15980 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
15990 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
159a0 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
159b0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
159c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
159d0 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20   jrnlOff;.      
159e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
159f0 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
15a00 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
15a10 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
15a20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
15a30 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
15a40 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
15a50 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
15a60 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
15a70 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
15a80 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
15a90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15aa0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
15ab0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
15ac0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
15ad0 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
15ae0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
15af0 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f  }..        jrnlO
15b00 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
15b10 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
15b20 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b  (aJournalMagic);
15b30 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
15b40 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
15b50 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a  %d\n", pPager, j
15b60 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20  rnlOff, 4));.   
15b70 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
15b80 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
15b90 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67  d, jrnlOff, pPag
15ba0 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
15bb0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
15bc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
15bd0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
15be0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
15bf0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
15c00 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
15c10 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
15c20 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
15c30 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
15c40 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
15c50 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
15c60 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
15c70 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
15c80 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
15c90 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a  r->sync_flags| .
15ca0 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
15cb0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53  r->sync_flags==S
15cc0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
15cd0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
15ce0 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
15cf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15d00 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
15d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15d20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
15d30 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
15d40 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
15d50 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
15d60 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65   /* Erase the ne
15d70 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d  edSync flag from
15d80 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20   every page..   
15d90 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
15da0 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
15db0 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
15dc0 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  che);.  }..  ret
15dd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15de0 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
15df0 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
15e00 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
15e10 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
15e20 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
15e30 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
15e40 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
15e50 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 20 63 61  base file. No ca
15e60 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a 20  lls are made.** 
15e70 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
15e80 65 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  e to mark the pa
15e90 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 20 49 74  ges as clean. It
15ea0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15eb0 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65  bility.** of the
15ec0 20 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 50   caller to use P
15ed0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20  cacheCleanAll() 
15ee0 6f 72 20 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  or PcacheMakeCle
15ef0 61 6e 28 29 20 74 6f 20 6d 61 72 6b 0a 2a 2a 20  an() to mark.** 
15f00 74 68 65 20 70 61 67 65 73 20 61 73 20 63 6c 65  the pages as cle
15f10 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
15f20 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
15f30 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
15f40 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
15f50 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
15f60 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
15f70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
15f80 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
15f90 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
15fa0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
15fb0 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
15fc0 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
15fd0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
15fe0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
15ff0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
16000 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
16010 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
16020 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
16030 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
16040 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
16050 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
16060 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
16070 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
16080 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
16090 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
160a0 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
160b0 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
160c0 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
160d0 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
160e0 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
160f0 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
16100 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
16110 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16120 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
16130 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
16140 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
16150 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
16160 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
16170 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
16180 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
16190 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
161a0 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
161b0 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
161c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
161d0 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
161e0 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
161f0 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
16200 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
16210 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
16220 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
16230 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
16240 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
16250 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
16260 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
16270 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
16280 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
16290 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
162a0 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
162b0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
162c0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
162d0 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
162e0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
162f0 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
16300 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
16310 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
16320 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
16330 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
16340 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
16350 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16360 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16370 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
16380 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ){..    /* If th
16390 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  e file has not y
163a0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
163b0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
163c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
163d0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
163e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
163f0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
16400 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
16410 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
16420 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
16430 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
16440 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
16450 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
16460 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16470 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
16480 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
16490 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
164a0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
164b0 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
164c0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
164d0 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
164e0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29  3PagerTruncate()
164f0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
16500 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
16510 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
16520 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
16530 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
16540 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
16550 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
16560 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
16570 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
16580 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
16590 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
165a0 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
165b0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
165c0 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
165d0 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e  et = (pList->pgn
165e0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
165f0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
16600 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20    char *pData = 
16610 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
16620 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69  List->pData, pLi
16630 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 0a 20  st->pgno, 6);.. 
16640 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34       PAGERTRACE4
16650 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
16660 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
16670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16680 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
16690 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
166a0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
166b0 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20 20  h(pList));.     
166c0 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
166d0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
166e0 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29  r, pList->pgno))
166f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
16700 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
16710 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
16720 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
16730 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
16740 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
16750 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
16760 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50  _count);.      P
16770 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
16780 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20  ->nWrite);.     
16790 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
167a0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
167b0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
167c0 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
167d0 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
167e0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
167f0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
16800 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
16810 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
16820 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
16830 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
16840 7a 65 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ze = pList->pgno
16850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16860 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
16870 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50     else{.      P
16880 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54  AGERTRACE3("NOST
16890 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
168a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
168b0 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
168c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
168d0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
168e0 72 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  rn rc;.#ifdef SQ
168f0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
16900 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
16910 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
16920 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
16930 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
16940 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
16950 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
16960 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16970 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16980 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
16990 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
169a0 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
169b0 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
169c0 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
169d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
169e0 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 75 72 67  ointer to a purg
169f0 65 61 62 6c 65 20 50 61 67 65 72 20 0a 2a 2a 20  eable Pager .** 
16a00 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 66 75 6e  object. This fun
16a10 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
16a20 6f 20 6d 61 6b 65 20 61 20 73 69 6e 67 6c 65 20  o make a single 
16a30 64 69 72 74 79 20 70 61 67 65 20 74 68 61 74 20  dirty page that 
16a40 68 61 73 20 6e 6f 0a 2a 2a 20 6f 75 74 73 74 61  has no.** outsta
16a50 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
16a60 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29   (if one exists)
16a70 20 63 6c 65 61 6e 20 73 6f 20 74 68 61 74 20 69   clean so that i
16a80 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
16a90 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 70 63 61  d .** by the pca
16aa0 63 68 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  che layer..*/.st
16ab0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
16ac0 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
16ad0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
16ae0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
16af0 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
16b00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
16b10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
16b20 4e 6f 74 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  NotSync ){.    r
16b30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16b40 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
16b50 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
16b60 5f 44 49 52 54 59 20 29 3b 0a 20 20 69 66 28 20  _DIRTY );.  if( 
16b70 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
16b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16b90 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
16ba0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
16bb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
16bc0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
16bd0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
16be0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
16bf0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
16c00 26 26 20 0a 20 20 20 20 20 20 20 20 21 28 70 50  && .        !(pP
16c10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
16c20 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
16c30 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a  MODE_MEMORY) &&.
16c40 20 20 20 20 20 20 20 20 21 28 73 71 6c 69 74 65          !(sqlite
16c50 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
16c60 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
16c70 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
16c80 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20  P_SAFE_APPEND). 
16c90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16ca0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
16cb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
16cc0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
16cd0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
16ce0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16cf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16d00 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
16d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
16d20 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
16d30 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
16d40 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
16d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16d60 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
16d70 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a  ger, rc);.    }.
16d80 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
16d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16da0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
16db0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
16dc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16dd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ../*.** Return 1
16de0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
16df0 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ot journal on th
16e00 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
16e10 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * A hot journal 
16e20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64  is one that need
16e30 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
16e40 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
16e50 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
16e60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
16e70 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
16e80 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
16e90 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
16ea0 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
16eb0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
16ec0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
16ed0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
16ee0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a  he same name.  J
16ef0 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a  ust delete the j
16f00 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65  ournal..**.** Re
16f10 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66  turn negative if
16f20 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72   unable to deter
16f30 6d 69 6e 65 20 74 68 65 20 73 74 61 74 75 73 20  mine the status 
16f40 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
16f50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16f60 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e  ne does not open
16f70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
16f80 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 69 74 73  e to examine its
16f90 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 48 65  .** content.  He
16fa0 6e 63 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nce, the journal
16fb0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 74   might contain t
16fc0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
16fd0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ter.** journal f
16fe0 69 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65  ile that has bee
16ff0 6e 20 64 65 6c 65 74 65 64 2c 20 61 6e 64 20 68  n deleted, and h
17000 65 6e 63 65 20 6e 6f 74 20 62 65 20 68 6f 74 2e  ence not be hot.
17010 20 20 4f 72 0a 2a 2a 20 74 68 65 20 68 65 61 64    Or.** the head
17020 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
17030 6c 20 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 65  l might be zeroe
17040 64 20 6f 75 74 2e 20 20 54 68 69 73 20 72 6f 75  d out.  This rou
17050 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  tine.** does not
17060 20 64 69 73 63 6f 76 65 72 20 74 68 65 73 65 20   discover these 
17070 63 61 73 65 73 20 6f 66 20 61 20 6e 6f 6e 2d 68  cases of a non-h
17080 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d 20 69 66 20  ot journal - if 
17090 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
170a0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
170b0 73 20 6e 6f 74 20 65 6d 70 74 79 20 74 68 69 73  s not empty this
170c0 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
170d0 20 69 74 0a 2a 2a 20 69 73 20 68 6f 74 2e 20 20   it.** is hot.  
170e0 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
170f0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ck() routine wil
17100 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
17110 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
17120 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
17130 79 20 68 6f 74 20 61 6e 64 20 77 69 6c 6c 20 6e  y hot and will n
17140 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
17150 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
17160 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
17170 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a   int *pExists){.
17180 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
17190 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
171a0 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fs;.  int rc = S
171b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
171c0 65 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 6e  exists = 0;.  in
171d0 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20  t locked = 0;.  
171e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
171f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17200 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
17210 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
17220 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
17230 6f 64 73 20 29 3b 0a 20 20 2a 70 45 78 69 73 74  ods );.  *pExist
17240 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  s = 0;.  rc = sq
17250 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
17260 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
17270 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
17280 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
17290 73 74 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  sts);.  if( rc==
172a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
172b0 73 74 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sts ){.    rc = 
172c0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
172d0 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
172e0 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b  r->fd, &locked);
172f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
17300 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
17310 74 73 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  ts && !locked ){
17320 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  .    int nPage;.
17330 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17340 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
17350 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
17360 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 69 66  TE_OK ){.     if
17380 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
17390 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
173a0 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
173b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
173c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
173d0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
173e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
173f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17400 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
17410 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
17420 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
17430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17440 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
17450 74 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67  t readDbPage(Pag
17460 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
17470 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  r *pPg, Pgno pgn
17480 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
17490 69 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73  i64 offset;.  as
174a0 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
174b0 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
174c0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
174d0 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
174e0 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  e);.  if( !pPage
174f0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
17500 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17510 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
17520 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66  _READ;.  }.  off
17530 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
17540 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
17550 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
17560 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
17570 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
17580 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17590 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ize, offset);.  
175a0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
175b0 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
175c0 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
175d0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
175e0 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
175f0 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
17600 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
17610 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
17620 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
17630 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
17640 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
17650 74 61 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20  ta)[24],.       
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50         sizeof(pP
17690 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
176a0 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31  ));.  }.  CODEC1
176b0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
176c0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
176d0 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  3);.  PAGERTRACE
176e0 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  4("FETCH %d page
176f0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
17700 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17710 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
17720 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61  ), pPg->pgno, pa
17730 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
17740 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
17750 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
17760 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17770 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
17780 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71   shared lock req
17790 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  uired before.** 
177a0 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64  data may be read
177b0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
177c0 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68  cache. If the sh
177d0 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c  ared lock has al
177e0 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62  ready.** been ob
177f0 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  tained, this fun
17800 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
17810 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74  ..**.** Immediat
17820 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
17830 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
17840 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64  ock (if required
17850 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
17860 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61  .** checks for a
17870 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
17880 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  e. If one is fou
17890 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  nd, an emergency
178a0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20   rollback.** is 
178b0 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69  performed immedi
178c0 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
178d0 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64   int pagerShared
178e0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
178f0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
17900 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
17910 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20   isErrorReset = 
17920 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  0;..  /* If this
17930 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
17940 6e 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76  ned for exclusiv
17950 65 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f  e access, has no
17960 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20   outstanding .  
17970 2a 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ** page referenc
17980 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20  es and is in an 
17990 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77  error-state, now
179a0 20 69 73 20 74 68 65 20 63 68 61 6e 63 65 20 74   is the chance t
179b0 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65  o clear.  ** the
179c0 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20   error. Discard 
179d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
179e0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
179f0 61 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20  and treat any.  
17a00 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  ** open journal 
17a10 66 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f  file as a hot-jo
17a20 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  urnal..  */.  if
17a30 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
17a40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
17a50 65 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  e .   && sqlite3
17a60 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
17a70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
17a80 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  =0 && pPager->er
17a90 72 43 6f 64 65 20 0a 20 20 29 7b 0a 20 20 20 20  rCode .  ){.    
17aa0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
17ab0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  nalOpen ){.     
17ac0 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20   isErrorReset = 
17ad0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
17ae0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
17af0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61  QLITE_OK;.    pa
17b00 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
17b10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
17b20 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69  the pager is sti
17b30 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  ll in an error s
17b40 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f  tate, do not pro
17b50 63 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20  ceed. The error 
17b60 0a 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c  .  ** state will
17b70 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 73   be cleared at s
17b80 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
17b90 20 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c   future when all
17ba0 20 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65   page .  ** refe
17bb0 72 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70  rences are dropp
17bc0 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
17bd0 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65   can be discarde
17be0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
17bf0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
17c00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17c10 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
17c20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
17c30 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
17c40 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
17c50 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
17c60 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65  OCK || isErrorRe
17c70 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  set ){.    sqlit
17c80 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
17c90 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
17ca0 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61   int isHotJourna
17cb0 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
17cc0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
17cd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17ce0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
17cf0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
17d00 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  =0 );.    if( !p
17d10 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
17d20 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  k ){.      rc = 
17d30 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
17d40 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
17d50 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
17d60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17d70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
17d80 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
17d90 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
17da0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
17db0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
17dc0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
17dd0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
17de0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
17df0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
17e00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
17e10 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
17e20 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
17e30 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
17e40 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
17e50 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
17e60 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
17e70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
17e80 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
17e90 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
17ea0 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65  if( !isErrorRese
17eb0 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
17ec0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
17ed0 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72  ager, &isHotJour
17ee0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
17ef0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17f00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
17f10 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
17f20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72    }.    if( isEr
17f30 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f  rorReset || isHo
17f40 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
17f50 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
17f60 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
17f70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17f80 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
17f90 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
17fa0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
17fb0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
17fc0 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
17fd0 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
17fe0 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
17ff0 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
18000 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
18010 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
18020 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
18030 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
18040 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
18050 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
18060 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
18070 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
18080 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
18090 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
180a0 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
180b0 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 62 61   it .      ** ba
180c0 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
180d0 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
180e0 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
180f0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
18100 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
18110 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
18120 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
18130 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
18140 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
18150 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
18160 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   ** obtain its o
18170 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
18180 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
18190 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  e file..      */
181a0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
181b0 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49  r->state<EXCLUSI
181c0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
181d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
181e0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
181f0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
18200 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18210 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18220 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
18230 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
18240 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
18250 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
18260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18270 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
18280 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
18290 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
182a0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
182b0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
182c0 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69  rite access. Thi
182d0 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
182e0 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
182f0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
18300 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
18310 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
18320 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20   open and.      
18330 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  ** possibly used
18340 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
18350 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20  on later on. On 
18360 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68  some systems, th
18370 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75  e.      ** OsTru
18380 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
18390 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
183a0 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
183b0 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
183c0 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
183d0 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
183e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
183f0 69 73 45 72 72 6f 72 52 65 73 65 74 20 26 26 20  isErrorReset && 
18400 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18410 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
18420 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
18430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18440 73 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61  sAccess(pVfs,pPa
18450 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51  ger->zJournal,SQ
18460 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
18470 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20  TS,&res);.      
18480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18490 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
184a0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
184b0 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
184c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
184d0 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
184e0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
184f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
18500 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
18510 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
18520 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
18530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
18540 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18550 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
18560 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
18570 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
18580 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
18590 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
185a0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
185b0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
185c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
185d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
185e0 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
185f0 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
18600 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
18610 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
18620 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18630 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
18640 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
18650 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18660 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18670 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
18680 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
18690 6f 74 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d  ot exist, that m
186a0 65 61 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  eans some other 
186b0 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20  process.        
186c0 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
186d0 64 79 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63  dy rolled it bac
186e0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  k */.           
186f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
18700 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  Y;.          }. 
18710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18720 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18740 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
18750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
18760 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
18770 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  en = 1;.      pP
18780 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
18790 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
187a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
187b0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
187c0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
187d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
187e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
187f0 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c  0;. .      /* Pl
18800 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
18810 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
18820 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
18830 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
18840 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
18850 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
18860 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
18870 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
18880 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
18890 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
188a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
188b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
188c0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
188d0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
188e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
188f0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
18900 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
18910 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20  R_SHARED || .   
18920 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
18930 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
18940 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
18950 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
18960 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
18970 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63   if( sqlite3Pcac
18980 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
18990 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
189a0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
189b0 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
189c0 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
189d0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
189e0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
189f0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
18a00 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
18a10 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
18a20 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
18a30 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
18a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
18a50 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
18a60 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
18a70 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
18a80 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
18a90 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
18aa0 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
18ab0 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
18ac0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
18ad0 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
18ae0 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
18af0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
18b00 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
18b10 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
18b20 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
18b30 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
18b40 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
18b50 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
18b60 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
18b70 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
18b80 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
18b90 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
18ba0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
18bb0 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
18bc0 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
18bd0 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
18be0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
18bf0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
18c00 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
18c10 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
18c20 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
18c30 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
18c40 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
18c50 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
18c60 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
18c70 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
18c80 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
18c90 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
18ca0 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
18cb0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18cc0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
18cd0 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
18ce0 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
18cf0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18d00 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
18d10 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 0);..      if(
18d20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18d30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
18d40 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18d50 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
18d60 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
18d70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
18d80 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
18d90 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
18da0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
18db0 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
18dc0 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
18dd0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
18de0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
18df0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
18e00 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
18e10 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
18e20 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
18e30 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
18e40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
18e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18e60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
18e70 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
18e80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18e90 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
18ea0 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
18eb0 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
18ec0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
18ed0 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
18ee0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
18ef0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
18f00 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
18f10 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
18f20 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
18f30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18f40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18f50 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
18f60 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
18f70 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  <=PAGER_SHARED )
18f80 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
18f90 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
18fa0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
18fb0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
18fc0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
18fd0 20 7d 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a   }.  }.. failed:
18fe0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18ff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70  E_OK ){.    /* p
19000 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
19010 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63   a no-op for exc
19020 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
19030 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
19040 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ses. */.    page
19050 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
19060 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19070 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
19080 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68   sure we have th
19090 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20  e content for a 
190a0 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
190b0 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f  ge was.** previo
190c0 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
190d0 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
190e0 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
190f0 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e  t was.** just in
19100 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
19110 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65  os instead of be
19120 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ing read from di
19130 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77  sk..** But now w
19140 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20  e need the real 
19150 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b  data off of disk
19160 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  .  So make sure 
19170 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20  we.** have it.  
19180 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65  Read it in if we
19190 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20   do not have it 
191a0 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74  already..*/.stat
191b0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74  ic int pager_get
191c0 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a  _content(PgHdr *
191d0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
191e0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
191f0 44 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 69 6e  D_READ ){.    in
19200 74 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67  t rc = readDbPag
19210 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70  e(pPg->pPager, p
19220 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  Pg, pPg->pgno);.
19230 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
19250 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
19260 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
19270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19280 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19290 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
192a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
192b0 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
192c0 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
192d0 63 68 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20 74  ched zero, and t
192e0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
192f0 69 6e 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c 65  in the.** middle
19300 20 6f 66 20 61 20 77 72 69 74 65 20 74 72 61 6e   of a write tran
19310 73 61 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e 65  saction or opene
19320 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  d in exclusive m
19330 6f 64 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e 0a  ode, unlock it..
19340 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
19350 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
19360 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
19370 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74  r){.  if( (sqlit
19380 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
19390 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
193a0 29 3d 3d 30 29 0a 20 20 20 20 26 26 20 28 21 70  )==0).    && (!p
193b0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
193c0 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
193d0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20  journalOff>0) . 
193e0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
193f0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
19400 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
19410 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67 65  *.** Drop a page
19420 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
19430 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  using sqlite3Pca
19440 63 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a  cheDrop()..**.**
19450 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
19460 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20  here are now no 
19470 70 61 67 65 73 20 77 69 74 68 20 72 65 66 65 72  pages with refer
19480 65 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20 61  ences to them, a
19490 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
194a0 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
194b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
194c0 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a   is removed..*/.
194d0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
194e0 72 44 72 6f 70 50 61 67 65 28 44 62 50 61 67 65  rDropPage(DbPage
194f0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
19500 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
19510 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33  Pager;.  sqlite3
19520 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
19530 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
19540 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
19550 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
19560 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
19570 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
19580 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
19590 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
195a0 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
195b0 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
195c0 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
195d0 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
195e0 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
195f0 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  eased..**.** Thi
19600 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
19610 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
19620 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
19630 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
19640 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
19650 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
19660 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
19670 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
19680 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
19690 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
196a0 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
196b0 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
196c0 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
196d0 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
196e0 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
196f0 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
19700 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
19710 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
19720 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
19730 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
19740 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
19750 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
19760 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
19770 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
19780 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
19790 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
197a0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
197b0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
197c0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
197d0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
197e0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
197f0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
19800 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
19810 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
19820 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
19830 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
19840 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
19850 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
19860 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
19870 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
19880 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
19890 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
198a0 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
198b0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
198c0 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
198d0 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
198e0 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
198f0 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
19900 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
19910 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
19920 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
19930 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
19940 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
19950 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
19960 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
19970 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
19980 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
19990 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
199a0 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
199b0 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20  t is false, the 
199c0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
199d0 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  e actually read 
199e0 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66  from disk..** If
199f0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
19a00 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
19a10 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
19a20 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
19a30 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
19a40 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  ge at this time,
19a50 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20   so do not do a 
19a60 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74  disk read.  Just
19a70 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20   fill in the.** 
19a80 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74  page content wit
19a90 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61  h zeros.  But ma
19aa0 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rk the fact that
19ab0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61   we have not rea
19ac0 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  d the.** content
19ad0 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
19ae0 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66  PgHdr.needRead f
19af0 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20  lag.  Later on, 
19b00 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  if .** sqlite3Pa
19b10 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
19b20 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67  lled on this pag
19b30 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
19b40 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tine is.** calle
19b50 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43  d again with noC
19b60 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20  ontent==0, that 
19b70 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63  means that the c
19b80 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64  ontent is needed
19b90 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b  .** and the disk
19ba0 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
19bb0 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
19bc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19bd0 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
19be0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
19bf0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
19c00 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
19c10 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
19c20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
19c30 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
19c40 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
19c50 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
19c60 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
19c70 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
19c80 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
19c90 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
19ca0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
19cb0 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
19cc0 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
19cd0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  true */.){.  PgH
19ce0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69  dr *pPg = 0;.  i
19cf0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
19d00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
19d10 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20  =PAGER_UNLOCK . 
19d20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
19d30 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
19d40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
19d50 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 67 6e  0 .       || pgn
19d60 6f 3d 3d 31 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  o==1.  );..  /* 
19d70 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
19d80 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
19d90 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
19da0 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
19db0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65  .  ** number gre
19dc0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
19dd0 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75  or zero, is requ
19de0 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ested..  */.  if
19df0 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
19e00 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30  _PGNO || pgno==0
19e10 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
19e20 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
19e30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
19e40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19e50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  T;.  }..  /* Mak
19e60 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
19e70 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
19e80 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
19e90 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67   .  assert( pPag
19ea0 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  er!=0 );.  *ppPa
19eb0 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  ge = 0;..  /* If
19ec0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
19ed0 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
19ee0 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
19ef0 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
19f00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19f10 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c  le. pagerSharedL
19f20 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
19f30 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61   if .  ** a data
19f40 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72  base lock is alr
19f50 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a  eady held..  */.
19f60 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
19f70 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
19f80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19f90 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
19fa0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
19fb0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19fc0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
19fd0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
19fe0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
19ff0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
1a000 67 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20  gno, 1, &pPg);. 
1a010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a020 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1a030 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
1a040 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 7b  Pg->pPager==0 ){
1a050 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
1a060 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
1a070 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
1a080 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
1a090 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
1a0a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 20  initialized..   
1a0b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   */.    int nMax
1a0c0 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1a0d0 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b  (pPager->nMiss);
1a0e0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
1a0f0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 6d   = pPager;.    m
1a100 65 6d 73 65 74 28 70 50 67 2d 3e 70 45 78 74 72  emset(pPg->pExtr
1a110 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  a, 0, pPager->nE
1a120 78 74 72 61 29 3b 0a 0a 20 20 20 20 72 63 20 3d  xtra);..    rc =
1a130 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1a140 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
1a150 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72  nMax);.    if( r
1a160 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a170 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1a180 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1a190 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a1a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d     }..    if( nM
1a1b0 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
1a1c0 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65  MEMDB || noConte
1a1d0 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
1a1e0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
1a1f0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gno ){.        s
1a200 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1a210 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
1a220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1a230 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
1a240 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
1a250 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
1a260 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1a270 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
1a280 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  .        pPg->fl
1a290 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
1a2a0 44 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a  D_READ;.      }.
1a2b0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1a2c0 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
1a2d0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1a2e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a2f0 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1a300 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e  pPager, pPg, pgn
1a310 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1a320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1a330 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1a340 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1a350 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1a360 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1a370 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
1a380 72 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a  rDropPage(pPg);.
1a390 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1a3a0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1a3b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1a3c0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
1a3d0 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
1a3e0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1a3f0 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  g);.#endif.  }el
1a400 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
1a410 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
1a420 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
1a430 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  he. */.    asser
1a440 74 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  t(sqlite3PcacheR
1a450 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
1a460 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 67  pPCache)>0 || pg
1a470 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45  no==1);.    PAGE
1a480 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1a490 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e  Hit);.    if( !n
1a4a0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
1a4b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
1a4c0 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
1a4d0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1a4e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1a4f0 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1a500 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1a510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a520 20 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d    }..  *ppPage =
1a530 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
1a540 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1a550 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
1a560 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
1a570 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
1a580 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
1a590 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
1a5a0 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
1a5b0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1a5c0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
1a5d0 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
1a5e0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
1a5f0 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
1a600 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
1a610 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
1a620 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1a630 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
1a640 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1a650 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
1a660 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
1a670 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
1a680 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
1a690 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1a6a0 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
1a6b0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1a6c0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
1a6d0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1a6e0 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
1a6f0 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
1a700 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
1a710 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
1a720 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
1a730 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
1a740 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1a750 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1a760 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1a770 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
1a780 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
1a790 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  ;..  if( (pPager
1a7a0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1a7b0 4e 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28 70 50  NLOCK).   && (pP
1a7c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
1a7d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1a7e0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
1a7f0 49 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20  ITE_FULL).  ){. 
1a800 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1a810 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
1a820 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
1a830 26 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  &pPg);.  }..  re
1a840 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
1a850 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
1a860 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1a870 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
1a880 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
1a890 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
1a8a0 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
1a8b0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1a8c0 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
1a8d0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
1a8e0 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
1a8f0 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
1a900 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
1a910 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
1a920 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
1a930 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
1a940 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  t sqlite3PagerUn
1a950 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
1a960 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
1a970 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
1a980 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1a990 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1a9a0 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
1a9b0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
1a9c0 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
1a9d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1a9e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
1a9f0 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
1aa00 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1aa10 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1aa20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1aa30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1aa40 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d  Open && !pPager-
1aa50 3e 73 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  >sjfd->pMethods 
1aa60 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
1aa70 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
1aa80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1aa90 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
1aaa0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
1aab0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
1aac0 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
1aad0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1aae0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
1aaf0 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
1ab00 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f  ->sjfd, SQLITE_O
1ab10 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
1ab20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ab30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ab40 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
1ab50 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
1ab60 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
1ab70 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
1ab80 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
1ab90 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1aba0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1abb0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
1abc0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
1abd0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1abe0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
1abf0 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
1ac00 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
1ac10 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
1ac20 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
1ac30 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
1ac40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1ac50 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1ac60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1ac70 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1ac80 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1ac90 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  Vfs;.  int flags
1aca0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
1acb0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
1acc0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
1acd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1ace0 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a  TE);..  int rc;.
1acf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ad00 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1ad10 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
1ad20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
1ad30 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
1ad40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
1ad50 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
1ad60 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1ad70 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
1ad80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
1ad90 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
1ada0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
1adb0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
1adc0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
1add0 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
1ade0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1adf0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
1ae00 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1ae10 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nal;.  }..  if( 
1ae20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ae30 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  pen==0 ){.    if
1ae40 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
1ae50 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  le ){.      flag
1ae60 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
1ae70 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
1ae80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1ae90 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
1aea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c 61 67  else{.      flag
1aeb0 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
1aec0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
1aed0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1aee0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1aef0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
1af00 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
1af10 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
1af20 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
1af30 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
1af40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1af50 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
1af60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1af70 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
1af80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
1af90 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
1afa0 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
1afb0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
1afc0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
1afd0 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
1afe0 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29  (pPager).      )
1aff0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
1b000 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1b010 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1b020 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
1b030 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
1b040 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1b050 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1b060 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1b070 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
1b080 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1b090 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1b0a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
1b0b0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  aster = 0;.    p
1b0c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1b0d0 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    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 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b100 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
1b110 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
1b120 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
1b130 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
1b140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b150 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
1b160 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20  pen_journal;.   
1b170 20 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d   }.  }.  pPager-
1b180 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
1b190 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
1b1a0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
1b1b0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1b1c0 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
1b1d0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
1b1e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1b1f0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
1b200 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1b210 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1b220 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1b230 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
1b240 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
1b250 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
1b260 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1b270 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
1b280 66 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  f( pPager->nSave
1b290 70 6f 69 6e 74 20 26 26 20 72 63 3d 3d 53 51 4c  point && rc==SQL
1b2a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1b2b0 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
1b2c0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  l(pPager);.  }. 
1b2d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b2e0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
1b2f0 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51  _NOMEM && rc!=SQ
1b300 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1b310 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1b320 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1b330 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
1b340 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1b360 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
1b370 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1b380 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
1b390 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
1b3a0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
1b3b0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
1b3c0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
1b3d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1b3e0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1b3f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
1b400 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
1b410 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b420 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
1b430 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
1b440 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
1b450 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
1b460 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
1b470 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1b480 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65  seTwo() is calle
1b490 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
1b4a0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1b4b0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1b4c0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1b4d0 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  rClose() is call
1b4e0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1b4f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1b500 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
1b510 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
1b520 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
1b530 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
1b540 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
1b550 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1b560 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
1b570 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
1b580 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
1b590 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
1b5a0 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
1b5b0 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
1b5c0 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
1b5d0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1b5e0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
1b5f0 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
1b600 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
1b610 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
1b620 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1b630 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1b640 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1b650 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
1b660 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
1b670 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
1b680 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b690 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
1b6a0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
1b6b0 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
1b6c0 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
1b6d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1b6e0 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
1b6f0 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
1b700 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
1b710 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
1b720 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
1b730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b740 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
1b750 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
1b760 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
1b770 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
1b780 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
1b790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1b7a0 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
1b7b0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
1b7c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1b7d0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1b7e0 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
1b7f0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
1b800 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1b810 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
1b820 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
1b830 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
1b840 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
1b850 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
1b860 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
1b870 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
1b880 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1b890 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
1b8a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1b8b0 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65  agerBegin(DbPage
1b8c0 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61   *pPg, int exFla
1b8d0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1b8e0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1b8f0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1b900 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1b910 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
1b920 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1b930 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1b940 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
1b950 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1b960 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
1b970 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b980 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
1b990 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1b9a0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 72   !MEMDB );.    r
1b9b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1b9c0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
1b9d0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
1b9e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b9f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
1ba00 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1ba10 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
1ba20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
1ba30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
1ba40 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1ba50 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
1ba60 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
1ba70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1ba80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ba90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1baa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
1bab0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1bac0 20 30 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41   0;.    PAGERTRA
1bad0 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE2("TRANSACTION
1bae0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1baf0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
1bb00 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
1bb10 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d  rnal && !pPager-
1bb20 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 20 20 20  >tempFile.      
1bb30 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
1bb40 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
1bb50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
1bb60 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  FF ){.      rc =
1bb70 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1bb80 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1bb90 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1bba0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1bbb0 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  en && pPager->jo
1bbc0 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
1bbd0 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
1bbe0 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ns when the page
1bbf0 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69  r was in exclusi
1bc00 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
1bc10 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74  he last.    ** t
1bc20 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77  ime a (read or w
1bc30 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f  rite) transactio
1bc40 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  n was successful
1bc50 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20  ly concluded.   
1bc60 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e   ** by this conn
1bc70 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20  ection. Instead 
1bc80 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  of deleting the 
1bc90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20  journal file it 
1bca0 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74  was .    ** kept
1bcb0 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72   open and either
1bcc0 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74   was truncated t
1bcd0 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69 74 73  o 0 bytes or its
1bce0 20 68 65 61 64 65 72 20 77 61 73 0a 20 20 20 20   header was.    
1bcf0 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  ** overwritten w
1bd00 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
1bd10 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1bd20 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b  ager->nRec==0 );
1bd30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1bd40 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
1bd50 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1bd60 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
1bd70 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73  rnal==0 );.    s
1bd80 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1bd90 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
1bda0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
1bdb0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
1bdc0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 20 70  3BitvecCreate( p
1bdd0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
1bde0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1bdf0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->pInJournal ){.
1be00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1be10 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
1be20 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
1be30 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
1be40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1be50 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
1be60 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1be70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
1be80 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1be90 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70  journalOpen || p
1bea0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1beb0 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  f>0 || rc!=SQLIT
1bec0 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
1bed0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
1bee0 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
1bef0 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
1bf00 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
1bf10 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
1bf20 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
1bf30 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
1bf40 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
1bf50 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
1bf60 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
1bf70 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
1bf80 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
1bf90 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
1bfa0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1bfb0 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
1bfc0 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
1bfd0 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
1bfe0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1bff0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1c000 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56  .  If the RESERV
1c010 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64  ED.** lock could
1c020 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64   not be acquired
1c030 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1c040 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
1c050 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  SY.  The.** call
1c060 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  ing routine must
1c070 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
1c080 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64  return value and
1c090 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
1c0a0 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79  to.** change any
1c0b0 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c   page data until
1c0c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1c0d0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1c0e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
1c0f0 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64  urnal file could
1c100 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
1c110 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b  because the disk
1c120 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65   is full,.** the
1c130 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
1c140 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55  eturns SQLITE_FU
1c150 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69  LL and does an i
1c160 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63  mmediate rollbac
1c170 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71  k..** All subseq
1c180 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d  uent write attem
1c190 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  pts also return 
1c1a0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69  SQLITE_FULL unti
1c1b0 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  l there.** is a 
1c1c0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
1c1d0 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20  agerCommit() or 
1c1e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1c1f0 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
1c200 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
1c210 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
1c220 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
1c230 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
1c240 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a  pData;.  Pager *
1c250 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1c260 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
1c270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1c280 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
1c290 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
1c2a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1c2b0 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61   .    return pPa
1c2c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1c2d0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1c2e0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
1c2f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
1c300 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  RM;.  }..  asser
1c310 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  t( !pPager->setM
1c320 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43  aster );..  CHEC
1c330 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
1c340 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
1c350 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1c360 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
1c370 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20  ontent==1, that 
1c380 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69  means.  ** we di
1c390 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64  dn't really read
1c3a0 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
1c3b0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  of the page.  Th
1c3c0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20  is can happen.  
1c3d0 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  ** (for example)
1c3e0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   when the page i
1c3f0 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f  s being moved to
1c400 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
1c410 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20  But.  ** now we 
1c420 61 72 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f  are (perhaps) mo
1c430 76 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66  ving the page of
1c440 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
1c450 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65  t for.  ** reuse
1c460 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
1c470 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61  know its origina
1c480 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61  l content so tha
1c490 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63  t content.  ** c
1c4a0 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  an be stored in 
1c4b0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1c4c0 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65  rnal.  So do the
1c4d0 20 72 65 61 64 20 61 74 20 74 68 69 73 0a 20 20   read at this.  
1c4e0 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ** time..  */.  
1c4f0 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
1c500 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69  ontent(pPg);.  i
1c510 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
1c520 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
1c530 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
1c540 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
1c550 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
1c560 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
1c570 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
1c580 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
1c590 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
1c5a0 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
1c5b0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
1c5c0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67  (pPg);.  if( pag
1c5d0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
1c5e0 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  && !subjRequires
1c5f0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
1c600 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1c610 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  che = 1;.    pPa
1c620 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
1c630 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
1c640 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
1c650 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
1c660 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1c670 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1c680 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
1c690 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1c6a0 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
1c6b0 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1c6c0 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
1c6d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1c6e0 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
1c6f0 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
1c700 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
1c710 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
1c720 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
1c730 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
1c740 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1c750 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1c760 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
1c770 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c780 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b  erBegin(pPg, 0);
1c790 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c7a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c7b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c7c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c7d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1c7e0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1c7f0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1c800 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1c810 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1c820 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50  .          && pP
1c830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1c840 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
1c850 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
1c860 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
1c870 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
1c880 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1c890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1c8a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1c8b0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1c8c0 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  ache = 1;.    pP
1c8d0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
1c8e0 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
1c8f0 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1c900 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
1c910 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
1c920 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
1c930 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
1c940 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
1c950 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
1c960 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
1c970 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
1c980 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
1c990 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
1c9a0 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
1c9b0 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
1c9c0 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75    if( !pageInJou
1c9d0 72 6e 61 6c 28 70 50 67 29 20 26 26 20 70 50 61  rnal(pPg) && pPa
1c9e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1c9f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
1ca00 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
1ca10 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
1ca20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
1ca30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
1ca40 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20  pData2;..       
1ca50 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
1ca60 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
1ca70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1ca80 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20  e page that.    
1ca90 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
1caa0 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
1cab0 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
1cac0 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
1cad0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  es.        ** th
1cae0 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
1caf0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1cb00 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
1cb10 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1cb20 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 61  ) );.        pDa
1cb30 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1cb40 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1cb50 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
1cb60 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
1cb70 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
1cb80 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
1cb90 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
1cba0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
1cbb0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
1cbc0 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f  alOff, pPg->pgno
1cbd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1cbe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cbf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1cc00 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1cc10 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
1cc20 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
1cc30 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1cc60 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20  alOff + 4);.    
1cc70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1cc80 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
1cc90 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a  er->pageSize+4;.
1cca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ccb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ccc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ccd0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
1cce0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
1ccf0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1cd00 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  f, cksum);.     
1cd10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1cd20 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
1cd30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cd40 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
1cd50 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
1cd60 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1cd70 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
1cd80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1cd90 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
1cda0 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
1cdb0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
1cdc0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
1cdd0 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
1cde0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1cdf0 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  5("JOURNAL %d pa
1ce00 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
1ce10 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1ce20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
1ce30 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1ce40 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
1ce50 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
1ce60 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1ce70 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
1ce80 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
1ce90 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  ;..        /* Ev
1cea0 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
1ceb0 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
1cec0 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75  curred while jou
1ced0 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20  rnalling the.   
1cee0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
1cef0 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
1cf00 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79   set the need-sy
1cf10 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  nc flag for the 
1cf20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  page..        **
1cf30 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e   Otherwise, when
1cf40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cf50 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1cf60 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20   the logic in.  
1cf70 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63        ** playbac
1cf80 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
1cf90 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
1cfa0 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
1cfb0 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20  e restored.     
1cfc0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74     ** in the dat
1cfd0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
1cfe0 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
1cff0 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
1d000 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a  g so,.        **
1d010 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
1d020 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20   may follow..   
1d030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d040 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1d050 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
1d060 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
1d070 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
1d080 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1d090 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1d0a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1d0b0 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68     /* An error h
1d0c0 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69  as occured writi
1d0d0 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
1d0e0 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
1d0f0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
1d100 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
1d110 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
1d120 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
1d130 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1d140 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1d160 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1d170 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67   }..        pPag
1d180 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
1d190 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d1a0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
1d1b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
1d1c0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
1d1d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1d1e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1d1f0 20 20 20 20 20 20 61 64 64 54 6f 53 61 76 65 70        addToSavep
1d200 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
1d210 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
1d220 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d230 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1d240 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1d250 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
1d260 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
1d270 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
1d280 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
1d290 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1d2a0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1d2b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d2c0 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41    PAGERTRACE4("A
1d2d0 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
1d2e0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
1d2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d300 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d310 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20  , pPg->pgno,.   
1d320 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
1d330 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1d340 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 3b  EED_SYNC)?1:0));
1d350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d360 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
1d370 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1d380 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
1d390 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
1d3a0 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
1d3b0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1d3c0 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
1d3d0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1d3e0 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
1d3f0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
1d400 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
1d410 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
1d420 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
1d430 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
1d440 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
1d450 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
1d460 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
1d470 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
1d480 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
1d490 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 36  pPg) ){.      i6
1d4a0 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
1d4b0 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70  r->stmtNRec*(4+p
1d4c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1d4d0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
1d4e0 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
1d4f0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1d500 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
1d510 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e    assert( pageIn
1d520 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20  Journal(pPg) || 
1d530 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1d540 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
1d550 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1d560 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
1d570 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
1d580 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
1d590 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1d5b0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1d5c0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
1d5d0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
1d5e0 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
1d5f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d600 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54   PAGERTRACE3("ST
1d610 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
1d620 67 65 20 25 64 20 40 20 25 64 5c 6e 22 2c 20 50  ge %d @ %d\n", P
1d630 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1d640 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1d650 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d660 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1d670 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1d680 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1d690 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
1d6a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d6b0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
1d6c0 3b 0a 20 20 20 20 20 20 61 64 64 54 6f 53 61 76  ;.      addToSav
1d6d0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
1d6e0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
1d6f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1d700 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
1d710 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
1d720 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
1d730 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1d740 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1d750 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
1d760 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70  r->dbSize<pPg->p
1d770 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
1d780 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
1d790 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70  >pgno;.    if( p
1d7a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
1d7b0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1d7c0 61 67 65 72 29 2d 31 29 20 29 7b 0a 20 20 20 20  ager)-1) ){.    
1d7d0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1d7e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1d7f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d800 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1d810 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72  n is used to mar
1d820 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61 73  k a data-page as
1d830 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73   writable. It us
1d840 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69  es .** pager_wri
1d850 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a  te() to open a j
1d860 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
1d870 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1d880 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77  y open).** and w
1d890 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a 70  rite the page *p
1d8a0 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72  Data to the jour
1d8b0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  nal..**.** The d
1d8c0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1d8d0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1d8e0 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
1d8f0 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
1d900 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
1d910 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
1d920 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
1d930 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
1d940 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
1d950 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
1d960 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
1d970 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
1d980 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
1d990 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
1d9a0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1d9b0 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
1d9c0 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
1d9d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
1d9e0 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
1d9f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1da00 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
1da10 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
1da20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1da30 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1da40 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
1da50 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
1da60 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
1da70 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
1da80 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74  if( nPagePerSect
1da90 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
1daa0 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
1dab0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1dac0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1dad0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1dae0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
1db10 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
1db20 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
1db30 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
1db40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1db50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1db60 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
1db70 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
1db80 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
1db90 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
1dba0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   0;..    /* Set 
1dbb0 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
1dbc0 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
1dbd0 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
1dbe0 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
1dbf0 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
1dc00 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
1dc10 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
1dc20 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
1dc30 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
1dc40 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1dc50 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
1dc60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
1dc70 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
1dc80 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
1dc90 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
1dca0 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
1dcb0 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
1dcc0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
1dcd0 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
1dce0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
1dcf0 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
1dd00 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
1dd10 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
1dd20 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
1dd30 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1dd40 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
1dd50 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
1dd60 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
1dd70 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
1dd80 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
1dd90 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
1dda0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1ddb0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
1ddc0 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
1ddd0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
1dde0 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
1ddf0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1de00 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
1de10 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
1de20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
1de30 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
1de40 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1de50 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
1de60 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
1de70 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
1de80 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
1de90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1dea0 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
1deb0 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
1dec0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
1ded0 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
1dee0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
1def0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
1df00 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
1df10 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
1df20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
1df30 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
1df40 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
1df50 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
1df60 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
1df70 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
1df80 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
1df90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
1dfa0 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
1dfb0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1dfc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1dfd0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1dfe0 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
1dff0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1e000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e010 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1e020 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1e030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1e040 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
1e050 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1e060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e070 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
1e080 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1e090 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
1e0a0 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
1e0b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e0c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e0d0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
1e0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e0f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e100 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
1e110 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1e120 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
1e130 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
1e140 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1e150 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
1e160 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1e170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e180 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e190 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
1e1a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1e1b0 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  If the PgHdr.nee
1e1c0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
1e1d0 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
1e1e0 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
1e1f0 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
1e200 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
1e210 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
1e220 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
1e230 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
1e240 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
1e250 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
1e260 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
1e270 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
1e280 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
1e290 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
1e2a0 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
1e2b0 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
1e2c0 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
1e2d0 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
1e2e0 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
1e2f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1e300 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1e310 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
1e320 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
1e330 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
1e340 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  c==0 );.      fo
1e350 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
1e360 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69 69   && needSync; ii
1e370 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  ++){.        PgH
1e380 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65  dr *pPage = page
1e390 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1e3a0 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20   pg1+ii);.      
1e3b0 20 20 69 66 28 20 70 50 61 67 65 20 29 20 70 50    if( pPage ) pP
1e3c0 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  age->flags |= PG
1e3d0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
1e3e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1e3f0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
1e400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1e410 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65  ssert(pPager->ne
1e420 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a  edSync);.    }..
1e430 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e440 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31  er->doNotSync==1
1e450 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1e460 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20  doNotSync = 0;. 
1e470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1e480 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
1e490 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
1e4a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e4b0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1e4c0 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
1e4d0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
1e4e0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
1e4f0 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
1e500 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20  e3PagerWrite(). 
1e510 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1e520 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
1e530 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
1e540 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
1e550 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
1e560 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1e570 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1e580 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50  rIswriteable(DbP
1e590 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
1e5a0 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  urn pPg->flags&P
1e5b0 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65  GHDR_DIRTY;.}.#e
1e5c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
1e5d0 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
1e5e0 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
1e5f0 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
1e600 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
1e610 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
1e620 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
1e630 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
1e640 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
1e650 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
1e660 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
1e670 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68  s dirty.  This h
1e680 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
1e690 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ple, when.** the
1e6a0 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61   page has been a
1e6b0 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f  dded as a leaf o
1e6c0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
1e6d0 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e  nd so its.** con
1e6e0 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d  tent no longer m
1e6f0 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atters..**.** Th
1e700 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
1e710 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
1e720 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
1e730 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
1e740 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
1e750 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
1e760 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
1e770 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
1e780 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
1e790 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
1e7a0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
1e7b0 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
1e7c0 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
1e7d0 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
1e7e0 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
1e7f0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1e800 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77  Rollback() below
1e810 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62  , more than doub
1e820 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20  le the speed.** 
1e830 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20  of large INSERT 
1e840 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71  operations and q
1e850 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
1e860 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45  ed of large DELE
1e870 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  TEs..**.** When 
1e880 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e890 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20  called, set the 
1e8a0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1e8b0 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20  lag to true..** 
1e8c0 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
1e8d0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1e8e0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66  DontRollback() f
1e8f0 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  or the same page
1e900 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66  .** will thereaf
1e910 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20  ter be ignored. 
1e920 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
1e930 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72  ry to avoid a pr
1e940 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61  oblem.** where a
1e950 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20   page with data 
1e960 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1e970 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
1e980 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61  one part of.** a
1e990 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
1e9a0 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  n removed from t
1e9b0 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1e9c0 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a  ng a later part.
1e9d0 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74  ** of the same t
1e9e0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
1e9f0 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f  eused for some o
1ea00 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57  ther purpose.  W
1ea10 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72  hen it.** is fir
1ea20 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  st added to the 
1ea30 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72  freelist, this r
1ea40 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1ea50 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a  .  When reused,.
1ea60 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ** the sqlite3Pa
1ea70 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1ea80 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  ) routine is cal
1ea90 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73  led.  But becaus
1eaa0 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  e the.** page co
1eab0 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20  ntains critical 
1eac0 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e  data, we still n
1ead0 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69  eed to be sure i
1eae0 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64  t gets.** rolled
1eaf0 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f   back in spite o
1eb00 66 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  f the sqlite3Pag
1eb10 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1eb20 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71   call..*/.int sq
1eb30 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1eb40 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
1eb50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
1eb60 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
1eb70 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1eb80 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1eb90 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
1eba0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1ebb0 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
1ebc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ebd0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OK;.  }.  if( pP
1ebe0 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
1ebf0 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  lback==0 ){.    
1ec00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ec10 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
1ec20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79    pPager->pAlway
1ec30 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  sRollback = sqli
1ec40 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
1ec50 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1ec60 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ze);.    if( !pP
1ec70 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
1ec80 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  lback ){.      r
1ec90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1eca0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
1ecb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
1ecc0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 41  ecSet(pPager->pA
1ecd0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70  lwaysRollback, p
1ece0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 69 66  Pg->pgno);..  if
1ecf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ed00 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  && (pPg->flags&P
1ed10 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70  GHDR_DIRTY) && p
1ed20 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
1ed30 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  t==0 ){.    asse
1ed40 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1ed50 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1ed60 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1ed70 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 67 2d 3e  r->dbSize==pPg->
1ed80 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e  pgno && pPager->
1ed90 64 62 4f 72 69 67 53 69 7a 65 3c 70 50 61 67 65  dbOrigSize<pPage
1eda0 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
1edb0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61     /* If this pa
1edc0 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  ges is the last 
1edd0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
1ede0 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
1edf0 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a  s grown.      **
1ee00 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
1ee10 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
1ee20 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72   then do NOT mar
1ee30 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
1ee40 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68  ean..      ** Wh
1ee50 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
1ee60 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d  file grows, we m
1ee70 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ust make sure th
1ee80 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1ee90 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77  .      ** gets w
1eea0 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20  ritten at least 
1eeb0 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65  once so that the
1eec0 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20   disk file will 
1eed0 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  be the correct. 
1eee0 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66       ** size. If
1eef0 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74   you do not writ
1ef00 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20  e this page and 
1ef10 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1ef20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  file.      ** on
1ef30 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75   the disk ends u
1ef40 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c  p being too smal
1ef50 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64  l, that can lead
1ef60 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20   to database.   
1ef70 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e     ** corruption
1ef80 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74   during the next
1ef90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1efa0 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65      */.    }else
1efb0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
1efc0 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE3("DONT_WRITE 
1efd0 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
1efe0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
1eff0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1f000 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
1f010 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
1f020 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1f030 29 29 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  )).      pPg->fl
1f040 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e  ags |= PGHDR_DON
1f050 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20  T_WRITE;.#ifdef 
1f060 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1f070 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
1f080 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1f090 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
1f0a0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ndif.    }.  }. 
1f0b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f0c0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
1f0d0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
1f0e0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
1f0f0 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
1f100 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
1f110 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1f120 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1f130 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
1f140 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
1f150 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1f160 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
1f170 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
1f180 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
1f190 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
1f1a0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  rnal..**.** If w
1f1b0 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61  e have not yet a
1f1c0 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65  ctually read the
1f1d0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
1f1e0 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65   page (if.** the
1f1f0 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
1f200 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65  flag is set) the
1f210 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
1f220 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65  cts as a promise
1f230 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c  .** that we will
1f240 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72   never need to r
1f250 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ead the page con
1f260 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  tent in the futu
1f270 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65  re..** so the ne
1f280 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20  edRead flag can 
1f290 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68  be cleared at th
1f2a0 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69  is point..*/.voi
1f2b0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
1f2c0 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67  ntRollback(DbPag
1f2d0 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
1f2e0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1f2f0 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72  pPager;..  asser
1f300 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1f310 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1f320 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1f330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1f340 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f   not open, or Do
1f350 6e 74 57 72 69 74 65 28 29 20 68 61 73 20 62 65  ntWrite() has be
1f360 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a  en called on.  *
1f370 2a 20 74 68 69 73 20 70 61 67 65 20 28 44 6f 6e  * this page (Don
1f380 74 57 72 69 74 65 28 29 20 73 65 74 73 20 74 68  tWrite() sets th
1f390 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
1f3a0 20 66 6c 61 67 29 2c 20 74 68 65 6e 20 74 68 69   flag), then thi
1f3b0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
1f3c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1f3d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
1f3e0 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 0a 20  ournalOpen==0 . 
1f3f0 20 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76    || sqlite3Bitv
1f400 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
1f410 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  AlwaysRollback, 
1f420 70 50 67 2d 3e 70 67 6e 6f 29 0a 20 20 20 7c 7c  pPg->pgno).   ||
1f430 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
1f440 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20 20  r->dbOrigSize.  
1f450 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1f460 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1f470 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
1f480 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 69 74    if( sqlite3Bit
1f490 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
1f4a0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
1f4b0 3e 70 67 6e 6f 29 21 3d 30 0a 20 20 20 7c 7c 20  >pgno)!=0.   || 
1f4c0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1f4d0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
1f4e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1f4f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1f500 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 69 73  SECURE_DELETE is
1f510 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
1f520 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
1f530 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 72  that this.  ** r
1f540 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
1f550 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 20 66  lled on a page f
1f560 6f 72 20 77 68 69 63 68 20 73 71 6c 69 74 65 33  or which sqlite3
1f570 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
1f580 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65  .  ** has not be
1f590 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  en previously ca
1f5a0 6c 6c 65 64 20 64 75 72 69 6e 67 20 74 68 65 20  lled during the 
1f5b0 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
1f5c0 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 44 6f  ..  ** And if Do
1f5d0 6e 74 57 72 69 74 65 28 29 20 68 61 73 20 70 72  ntWrite() has pr
1f5e0 65 76 69 6f 75 73 6c 79 20 62 65 65 6e 20 63 61  eviously been ca
1f5f0 6c 6c 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lled, the follow
1f600 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64 69 74 69  ing.  ** conditi
1f610 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 2e  ons must be met.
1f620 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 4c 61 74 65  .  **.  ** (Late
1f630 72 3a 29 20 20 4e 6f 74 20 74 72 75 65 2e 20 20  r:)  Not true.  
1f640 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1f650 69 73 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  is corrupted by 
1f660 68 61 76 69 6e 67 20 64 75 70 6c 69 63 61 74 65  having duplicate
1f670 0a 20 20 2a 2a 20 70 61 67 65 73 20 6f 6e 20 74  .  ** pages on t
1f680 68 65 20 66 72 65 65 6c 69 73 74 20 28 65 78 3a  he freelist (ex:
1f690 20 63 6f 72 72 75 70 74 39 2e 74 65 73 74 29 20   corrupt9.test) 
1f6a0 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
1f6b0 6e 67 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  ng is not.  ** n
1f6c0 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 3a  ecessarily true:
1f6d0 0a 20 20 2a 2f 0a 20 20 2f 2a 20 61 73 73 65 72  .  */.  /* asser
1f6e0 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  t( !pPg->inJourn
1f6f0 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
1f700 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1f710 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 20 2a 2f  dbOrigSize ); */
1f720 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1f730 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
1f740 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 69  0 );.  sqlite3Bi
1f750 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
1f760 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
1f770 3e 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 66  >pgno);.  pPg->f
1f780 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
1f790 45 45 44 5f 52 45 41 44 3b 0a 20 20 61 64 64 54  EED_READ;.  addT
1f7a0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
1f7b0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
1f7c0 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41  gno);.  PAGERTRA
1f7d0 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
1f7e0 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
1f7f0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
1f800 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1f810 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47 41  ;.  IOTRACE(("GA
1f820 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20  RBAGE %p %d\n", 
1f830 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1f840 6f 29 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  o)).}.../*.** Th
1f850 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1f860 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
1f870 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1f880 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
1f890 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74  er,.** stored at
1f8a0 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20   byte 24 of the 
1f8b0 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pager file..*/.s
1f8c0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1f8d0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1f8e0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1f8f0 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b  , int isDirect){
1f900 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72  .  PgHdr *pPgHdr
1f910 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  ;.  u32 change_c
1f920 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63  ounter;.  int rc
1f930 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
1f940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
1f950 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
1f960 45 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69  E.  assert( isDi
1f970 72 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 69  rect==0 );  /* i
1f980 73 44 69 72 65 63 74 20 69 73 20 6f 6e 6c 79 20  sDirect is only 
1f990 74 72 75 65 20 66 6f 72 20 61 74 6f 6d 69 63 20  true for atomic 
1f9a0 77 72 69 74 65 73 20 2a 2f 0a 23 65 6e 64 69 66  writes */.#endif
1f9b0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1f9c0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1f9d0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
1f9e0 65 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  e>0 ){.    /* Op
1f9f0 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
1fa00 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
1fa10 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
1fa20 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1fa30 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
1fa40 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1fa50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1fa60 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20  rn rc;..    if( 
1fa70 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20  !isDirect ){.   
1fa80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fa90 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
1faa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1fad0 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
1fae0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1faf0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1fb00 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
1fb10 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1fb20 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1fb30 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1fb40 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61  e 24. */.    cha
1fb50 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1fb60 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1fb70 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  8*)pPager->dbFil
1fb80 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e  eVers);.    chan
1fb90 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
1fba0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1fbb0 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
1fbc0 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
1fbd0 75 6e 74 65 72 29 3b 0a 0a 23 69 66 64 65 66 20  unter);..#ifdef 
1fbe0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
1fbf0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69  OMIC_WRITE.    i
1fc00 66 28 20 69 73 44 69 72 65 63 74 20 26 26 20 70  f( isDirect && p
1fc10 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1fc20 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ods ){.      con
1fc30 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20  st void *zBuf = 
1fc40 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20  pPgHdr->pData;. 
1fc50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1fc60 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
1fc70 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
1fc80 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1fc90 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
1fca0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1fcb0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e, 0);.    }.#en
1fcc0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65  dif..    /* Rele
1fcd0 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
1fce0 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
1fcf0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1fd00 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50  (pPgHdr);.    pP
1fd10 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1fd20 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  tDone = 1;.  }. 
1fd30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1fd40 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
1fd50 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
1fd60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fd70 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
1fd80 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1fd90 72 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  rc;.  if( MEMDB 
1fda0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1fdb0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1fdc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fdd0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
1fde0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1fdf0 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
1fe00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1fe10 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
1fe20 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1fe30 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
1fe40 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1fe50 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
1fe60 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1fe70 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1fe80 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1fe90 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
1fea0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1feb0 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
1fec0 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
1fed0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
1fee0 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
1fef0 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
1ff00 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1ff10 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
1ff20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
1ff30 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1ff40 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
1ff50 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
1ff60 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
1ff70 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1ff80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ff90 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
1ffa0 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
1ffb0 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
1ffc0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1ffd0 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
1ffe0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1fff0 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
20000 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
20010 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
20020 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
20030 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
20040 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
20050 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
20060 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
20070 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
20080 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
20090 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
200a0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
200b0 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
200c0 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
200d0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
200e0 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
200f0 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
20100 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
20110 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2a 0a   databases)..**.
20120 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20  ** If the final 
20130 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79  parameter - noSy
20140 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68  nc - is true, th
20150 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
20160 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69  file itself.** i
20170 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68  s not synced. Th
20180 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61  e caller must ca
20190 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ll sqlite3PagerS
201a0 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74  ync() directly t
201b0 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61  o.** sync the da
201c0 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
201d0 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69  re calling Commi
201e0 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64  tPhaseTwo() to d
201f0 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  elete the.** jou
20200 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69  rnal file in thi
20210 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s case..*/.int s
20220 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20230 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67  tPhaseOne(.  Pag
20240 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 63  er *pPager, .  c
20250 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
20260 65 72 2c 20 0a 20 20 50 67 6e 6f 20 6e 54 72 75  er, .  Pgno nTru
20270 6e 63 2c 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63  nc,.  int noSync
20280 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
20290 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
202a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
202b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
202c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
202d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20    }..  /* If no 
202e0 63 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65  changes have bee
202f0 6e 20 6d 61 64 65 2c 20 77 65 20 63 61 6e 20 6c  n made, we can l
20300 65 61 76 65 20 74 68 65 20 74 72 61 6e 73 61 63  eave the transac
20310 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2f  tion early..  */
20320 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
20330 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a  bModified==0 &&.
20340 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
20350 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
20360 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20370 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20  DELETE ||.      
20380 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
20390 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b  usiveMode!=0) ){
203a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
203b0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d  ger->dirtyCache=
203c0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 || pPager->jo
203d0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
203e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
203f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  E_OK;.  }..  PAG
20400 45 52 54 52 41 43 45 34 28 22 44 41 54 41 42 41  ERTRACE4("DATABA
20410 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
20420 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a   zMaster=%s nSiz
20430 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  e=%d\n", .      
20440 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
20450 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  e, zMaster, pPag
20460 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20  er->dbSize);..  
20470 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
20480 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
20490 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
204a0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
204b0 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   or this.  ** fu
204c0 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
204d0 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
204e0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  it is a no-op.. 
204f0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
20500 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
20510 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20  YNCED && !MEMDB 
20520 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  && pPager->dirty
20530 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48  Cache ){.    PgH
20540 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66  dr *pPg;..#ifdef
20550 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
20560 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
20570 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72  /* The atomic-wr
20580 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
20590 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20   can be used if 
205a0 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  all of the.    *
205b0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  * following are 
205c0 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  true:.    **.   
205d0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c   **    + The fil
205e0 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
205f0 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
20600 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a  te property for.
20610 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63      **      bloc
20620 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d  ks of size page-
20630 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  size, and.    **
20640 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69      + This commi
20650 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  t is not part of
20660 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
20670 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
20680 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74     **    + Exact
20690 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
206a0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
206b0 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
206c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
206d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
206e0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
206f0 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e  an be used, then
20700 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20710 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20  e will never.   
20720 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20 66   ** be created f
20730 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  or this transact
20740 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
20750 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69  int useAtomicWri
20760 74 65 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  te;.    pPg = sq
20770 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
20780 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
20790 61 63 68 65 29 3b 0a 20 20 20 20 75 73 65 41 74  ache);.    useAt
207a0 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20  omicWrite = (.  
207b0 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26        !zMaster &
207c0 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
207d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
207e0 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
207f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
20800 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
20810 67 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20  ger) && .       
20820 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
20830 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
20840 69 7a 65 20 26 26 20 0a 20 20 20 20 20 20 20 20  ize && .        
20850 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  (pPg==0 || pPg->
20860 70 44 69 72 74 79 3d 3d 30 29 0a 20 20 20 20 29  pDirty==0).    )
20870 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
20880 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
20890 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n || pPager->jou
208a0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
208b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
208c0 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41 74  );.    if( useAt
208d0 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20  omicWrite ){.   
208e0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
208f0 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
20900 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
20910 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66   */.      int of
20920 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
20930 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
20940 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
20950 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20960 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29  pPager->nRec==1)
20970 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
20980 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
20990 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  >jfd, offset, pP
209a0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
209b0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
209c0 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
209d0 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f   counter. The fo
209e0 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
209f0 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a  l modify.      *
20a00 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  * the in-memory 
20a10 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
20a20 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c  f page 1 to incl
20a30 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a  ude the updated.
20a40 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20        ** change 
20a50 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
20a60 20 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69   write page 1 di
20a70 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61  rectly to the da
20a80 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
20a90 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
20aa0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
20ab0 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  e property of th
20ac0 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
20ad0 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  em, .      ** th
20ae0 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
20af0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
20b00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20b10 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
20b20 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
20b30 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29  unter(pPager, 1)
20b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
20b50 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20b60 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
20b70 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
20b80 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
20b90 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74  ( !useAtomicWrit
20ba0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
20bb0 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20  OK ).#endif..   
20bc0 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   /* If a master 
20bd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
20be0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
20bf0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
20c00 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
20c10 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73   file, then no s
20c20 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
20c30 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
20c40 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20  en it is.    ** 
20c50 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68  written, then th
20c60 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20  e process fails 
20c70 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
20c80 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e  a RESERVED to an
20c90 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
20ca0 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74  E lock. The next
20cb0 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73   time the proces
20cc0 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69  s tries to commi
20cd0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
20ce0 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a  nsaction the m-j
20cf0 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20   name will have 
20d00 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
20d10 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
20d20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65   if( !pPager->se
20d30 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  tMaster ){.     
20d40 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
20d50 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
20d60 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
20d70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20d80 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
20d90 78 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xit;.      if( p
20da0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
20db0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
20dc0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66  LMODE_OFF ){.#if
20dd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20de0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20df0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
20e00 64 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  dbSize<pPager->d
20e10 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
20e20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
20e30 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
20e40 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
20e50 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
20e60 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
20e70 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64        ** being d
20e80 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
20e90 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
20ea0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
20eb0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
20ec0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
20ed0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
20ee0 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20      Pgno i;.    
20ef0 20 20 20 20 20 20 50 67 6e 6f 20 69 53 6b 69 70        Pgno iSkip
20f00 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
20f10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
20f20 20 20 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 20      Pgno dbSize 
20f30 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
20f40 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
20f50 20 69 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   i=pPager->dbSiz
20f60 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  e+1; i<=pPager->
20f70 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20  dbOrigSize; i++ 
20f80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
20f90 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
20fa0 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
20fb0 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
20fc0 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
20fd0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
20fe0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
20ff0 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b  Pager, i, &pPg);
21000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21010 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21020 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
21030 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
21040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21050 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
21060 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21070 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
21080 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
21090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
210a0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
210b0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
210c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 20    }.          } 
210d0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
210e0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69  r->dbSize = dbSi
210f0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  ze;.        }.#e
21100 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 63 20  ndif.        rc 
21110 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  = writeMasterJou
21120 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
21130 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ster);.        i
21140 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21150 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
21160 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
21170 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
21180 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
21190 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
211a0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
211b0 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e  sync_exit;..#ifn
211c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
211d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
211e0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
211f0 65 3c 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  e<pPager->dbFile
21200 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
21210 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
21220 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
21230 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
21240 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
21250 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
21260 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
21270 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
21280 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
21290 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
212a0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
212b0 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
212c0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
212d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
212e0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
212f0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
21300 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
21310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21320 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21330 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
21340 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 2f 2a  CKED );.      /*
21350 20 54 68 65 20 65 72 72 6f 72 20 6d 69 67 68 74   The error might
21360 20 68 61 76 65 20 6c 65 66 74 20 74 68 65 20 64   have left the d
21370 69 72 74 79 20 6c 69 73 74 20 61 6c 6c 20 66 6f  irty list all fo
21380 75 6c 65 64 20 75 70 20 68 65 72 65 2c 0a 20 20  uled up here,.  
21390 20 20 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20      ** but that 
213a0 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20  does not matter 
213b0 62 65 63 61 75 73 65 20 69 66 20 74 68 65 20 69  because if the i
213c0 66 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  f the dirty list
213d0 20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20 67 65   did.      ** ge
213e0 74 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  t corrupted, the
213f0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
21400 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61 63 6b  n will roll back
21410 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 64 69   and.      ** di
21420 73 63 61 72 64 20 74 68 65 20 64 69 72 74 79 20  scard the dirty 
21430 6c 69 73 74 2e 20 20 54 68 65 72 65 20 69 73 20  list.  There is 
21440 61 6e 20 61 73 73 65 72 74 20 69 6e 0a 20 20 20  an assert in.   
21450 20 20 20 2a 2a 20 70 61 67 65 72 5f 67 65 74 5f     ** pager_get_
21460 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
21470 29 20 74 68 61 74 20 76 65 72 69 66 69 65 73 20  ) that verifies 
21480 74 68 61 74 20 6e 6f 20 61 74 74 65 6d 70 74 0a  that no attempt.
21490 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61 64 65        ** is made
214a0 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 76 61 6c   to use an inval
214b0 69 64 20 64 69 72 74 79 20 6c 69 73 74 2e 0a 20  id dirty list.. 
214c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f       */.      go
214d0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
214e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
214f0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
21500 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
21510 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
21520 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
21530 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
21540 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e  er->noSync && !n
21550 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
21560 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
21570 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
21580 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
21590 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  );.    }.    IOT
215a0 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70  RACE(("DBSYNC %p
215b0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
215c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
215d0 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
215e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d  .  }else if( MEM
215f0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
21600 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 46  Size<pPager->dbF
21610 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  ileSize ){.    r
21620 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21630 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  Truncate(pPager,
21640 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
21650 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74  ;.  }..sync_exit
21660 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
21670 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
21680 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72   ){.    /* pager
21690 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
216a0 74 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70  ter() may attemp
216b0 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65  t to obtain an e
216c0 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20  xclusive.     * 
216d0 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68  lock to spill th
216e0 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 74 75  e cache and retu
216f0 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  rn IOERR_BLOCKED
21700 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20  . But since .   
21710 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20    * there is no 
21720 63 68 61 6e 63 65 20 74 68 65 20 63 61 63 68 65  chance the cache
21730 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   is inconsistent
21740 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a 20 62  , it is.     * b
21750 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  etter to return 
21760 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
21770 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
21780 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
21790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
217a0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
217b0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
217c0 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
217d0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
217e0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
217f0 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
21800 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
21810 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
21820 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
21830 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
21840 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
21850 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
21860 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
21870 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
21880 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21890 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50  CommitPhaseTwo(P
218a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
218b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
218c0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
218d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
218e0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
218f0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
21900 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
21910 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
21920 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
21930 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
21940 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
21950 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26  dbModified==0 &&
21960 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
21970 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
21980 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21990 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20  _DELETE ||.     
219a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63       pPager->exc
219b0 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20 29  lusiveMode!=0) )
219c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
219d0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
219e0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ==0 || pPager->j
219f0 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
21a00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21a10 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 50 41 47  TE_OK;.  }.  PAG
21a20 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54  ERTRACE2("COMMIT
21a30 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
21a40 70 50 61 67 65 72 29 29 3b 0a 20 20 61 73 73 65  pPager));.  asse
21a50 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
21a60 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
21a70 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61  || MEMDB || !pPa
21a80 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
21a90 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
21aa0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
21ab0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
21ac0 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 63  setMaster);.  rc
21ad0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
21ae0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 72 65  Pager, rc);.  re
21af0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21b00 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
21b10 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
21b20 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
21b30 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
21b40 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
21b50 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
21b60 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
21b70 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
21b80 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
21b90 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
21ba0 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
21bb0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
21bc0 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
21bd0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
21be0 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
21bf0 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
21c00 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
21c10 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
21c20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
21c30 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
21c40 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
21c50 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
21c60 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
21c70 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
21c80 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
21c90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
21ca0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
21cb0 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
21cc0 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
21cd0 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
21ce0 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
21cf0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
21d00 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
21d10 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
21d20 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
21d30 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
21d40 49 54 45 5f 4f 4b 3b 0a 20 20 50 41 47 45 52 54  ITE_OK;.  PAGERT
21d50 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
21d60 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
21d70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 21  Pager));.  if( !
21d80 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
21d90 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
21da0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
21db0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
21dc0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
21dd0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
21de0 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65  Master);.  }else
21df0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
21e00 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
21e10 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
21e20 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
21e30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
21e40 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
21e50 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
21e60 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
21e70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
21e80 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
21e90 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
21ea0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
21eb0 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
21ec0 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
21ed0 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  c2;.      rc = p
21ee0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
21ef0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
21f00 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
21f10 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
21f20 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
21f30 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
21f40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21f50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21f60 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
21f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
21f80 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
21f90 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
21fa0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45    }..    if( !ME
21fb0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
21fc0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
21fd0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
21fe0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
21ff0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
22000 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
22010 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
22020 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
22030 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
22040 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
22050 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
22060 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
22070 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65  .    ** persiste
22080 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  nt..    */.    r
22090 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
220a0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d  pPager, rc);.  }
220b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
220c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
220d0 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
220e0 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
220f0 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
22100 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
22110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
22120 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
22130 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c  table..*/.u8 sql
22140 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
22150 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
22160 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
22170 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
22180 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
22190 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
221a0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
221b0 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
221c0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
221d0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
221e0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
221f0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
22200 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22210 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
22220 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
22230 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
22240 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
22250 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
22260 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
22270 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65  nt(DbPage *pPage
22280 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
22290 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
222a0 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a  count(pPage);.}.
222b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
222c0 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
222d0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
222e0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
222f0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
22300 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
22310 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
22320 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
22330 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
22340 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  0] = sqlite3Pcac
22350 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
22360 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
22370 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [1] = sqlite3Pca
22380 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
22390 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
223a0 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[2] = sqlite3P
223b0 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a  cacheGetCachesiz
223c0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
223d0 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  e);.  a[3] = pPa
223e0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
223f0 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d   ? (int) pPager-
22400 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20  >dbSize : -1;.  
22410 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
22420 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
22430 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
22440 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
22450 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
22460 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
22470 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55   a[8] = 0;  /* U
22480 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72  sed to be pPager
22490 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39  ->nOvfl */.  a[9
224a0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61  ] = pPager->nRea
224b0 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61  d;.  a[10] = pPa
224c0 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72  ger->nWrite;.  r
224d0 65 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74 20 73  eturn a;.}.int s
224e0 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d  qlite3PagerIsMem
224f0 64 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  db(Pager *pPager
22500 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44  ){.  return MEMD
22510 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B;.}.#endif../*.
22520 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
22530 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73  here are at leas
22540 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76  t nSavepoint sav
22550 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 0a 2a 2f  epoints open..*/
22560 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22570 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50  rOpenSavepoint(P
22580 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22590 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t nSavepoint){. 
225a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
225b0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 53 61 76  _OK;..  if( nSav
225c0 65 70 6f 69 6e 74 3e 70 50 61 67 65 72 2d 3e 6e  epoint>pPager->n
225d0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 50 61  Savepoint && pPa
225e0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
225f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a  ){.    int ii;..
22600 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
22610 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
22620 20 6f 70 65 6e 20 6f 72 20 74 68 65 72 65 20 61   open or there a
22630 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
22640 65 70 6f 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20  epoints. */.    
22650 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22660 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c  nSavepoint==0 ||
22670 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d 3e 70   pPager->sjfd->p
22680 4d 65 74 68 6f 64 73 20 29 3b 0a 0a 20 20 20 20  Methods );..    
22690 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65  /* Grow the Page
226a0 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72  r.aSavepoint arr
226b0 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63  ay using realloc
226c0 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  (). Return SQLIT
226d0 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69  E_NOMEM.    ** i
226e0 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
226f0 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73   fails. Otherwis
22700 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20  e, zero the new 
22710 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20  portion in case 
22720 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63  a .    ** malloc
22730 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
22740 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67  while populating
22750 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e   it in the for(.
22760 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a  ..) loop below..
22770 20 20 20 20 2a 2f 0a 20 20 20 20 50 61 67 65 72      */.    Pager
22780 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77 20  Savepoint *aNew 
22790 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  = (PagerSavepoin
227a0 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  t *)sqlite3Reall
227b0 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67  oc(.        pPag
227c0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20  er->aSavepoint, 
227d0 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
227e0 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e  point)*nSavepoin
227f0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
22800 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !aNew ){.      
22810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
22820 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
22830 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 50 61 67  emset(&aNew[pPag
22840 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 5d 2c  er->nSavepoint],
22850 20 30 2c 0a 20 20 20 20 20 20 20 20 28 6e 53 61   0,.        (nSa
22860 76 65 70 6f 69 6e 74 20 2d 20 70 50 61 67 65 72  vepoint - pPager
22870 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 2a 20  ->nSavepoint) * 
22880 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
22890 70 6f 69 6e 74 29 0a 20 20 20 20 29 3b 0a 20 20  point).    );.  
228a0 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
228b0 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20  oint = aNew;.   
228c0 20 69 69 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53   ii = pPager->nS
228d0 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 70 50  avepoint;.    pP
228e0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
228f0 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a   = nSavepoint;..
22900 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
22910 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
22920 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75  nt structures ju
22930 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f  st allocated. */
22940 0a 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 2d 6f  .    for(/* no-o
22950 70 20 2a 2f 3b 20 69 69 3c 6e 53 61 76 65 70 6f  p */; ii<nSavepo
22960 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
22970 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22980 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
22990 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
229a0 6e 4f 72 69 67 20 3d 20 70 50 61 67 65 72 2d 3e  nOrig = pPager->
229b0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  dbSize;.      if
229c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
229d0 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
229e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b  >journalOff>0 ){
229f0 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69  .        aNew[ii
22a00 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ].iOffset = pPag
22a10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
22a20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22a30 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
22a40 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f  ffset = JOURNAL_
22a50 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
22a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e        }.      aN
22a70 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d  ew[ii].iSubRec =
22a80 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
22a90 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  c;.      aNew[ii
22aa0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ].pInSavepoint =
22ab0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
22ac0 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
22ad0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
22ae0 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76  !aNew[ii].pInSav
22af0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
22b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22b10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
22b20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65     }..    /* Ope
22b30 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
22b40 6c 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  l, if it is not 
22b50 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20  already opened. 
22b60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  */.    rc = open
22b70 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
22b80 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
22b90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
22ba0 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73 20 61  arameter op is a
22bb0 6c 77 61 79 73 20 65 69 74 68 65 72 20 53 41 56  lways either SAV
22bc0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
22bd0 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
22be0 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69  EASE..** If it i
22bf0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
22c00 41 53 45 2c 20 74 68 65 6e 20 72 65 6c 65 61 73  ASE, then releas
22c10 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68  e and destroy th
22c20 65 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  e savepoint with
22c30 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61 76 65 70  .** index iSavep
22c40 6f 69 6e 74 2e 20 49 66 20 69 74 20 69 73 20 53  oint. If it is S
22c50 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
22c60 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b  K, then rollback
22c70 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20   all changes.** 
22c80 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72 65  that have occure
22c90 64 20 73 69 6e 63 65 20 73 61 76 65 70 6f 69 6e  d since savepoin
22ca0 74 20 69 53 61 76 65 70 6f 69 6e 74 20 77 61 73  t iSavepoint was
22cb0 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
22cc0 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
22cd0 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77  all savepoints w
22ce0 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65  ith an index gre
22cf0 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70  ater than iSavep
22d00 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73  oint .** are des
22d10 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  troyed..**.** If
22d20 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20   there are less 
22d30 74 68 61 6e 20 28 69 53 61 76 65 70 6f 69 6e 74  than (iSavepoint
22d40 2b 31 29 20 61 63 74 69 76 65 20 73 61 76 65 70  +1) active savep
22d50 6f 69 6e 74 73 20 77 68 65 6e 20 74 68 69 73 20  oints when this 
22d60 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
22d70 63 61 6c 6c 65 64 20 69 74 20 69 73 20 61 20 6e  called it is a n
22d80 6f 2d 6f 70 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  o-op..*/ .int sq
22d90 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
22da0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
22db0 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  r, int op, int i
22dc0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
22dd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22de0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
22df0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
22e00 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
22e10 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
22e20 0a 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e  .  if( iSavepoin
22e30 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  t<pPager->nSavep
22e40 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  oint ){.    int 
22e50 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77  ii;.    int nNew
22e60 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20   = iSavepoint + 
22e70 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  (op==SAVEPOINT_R
22e80 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 66 6f  OLLBACK);.    fo
22e90 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50  r(ii=nNew; ii<pP
22ea0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
22eb0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; ii++){.      s
22ec0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
22ed0 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
22ee0 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
22ef0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
22f00 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76      pPager->nSav
22f10 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a  epoint = nNew;..
22f20 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45      if( op==SAVE
22f30 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26  POINT_ROLLBACK &
22f40 26 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  & pPager->jfd->p
22f50 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
22f60 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
22f70 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e  *pSavepoint = (n
22f80 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65  New==0)?0:&pPage
22f90 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e  r->aSavepoint[nN
22fa0 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  ew-1];.      rc 
22fb0 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  = pagerPlaybackS
22fc0 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c  avepoint(pPager,
22fd0 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   pSavepoint);.  
22fe0 20 20 20 20 61 73 73 65 72 74 28 72 63 21 3d 53      assert(rc!=S
22ff0 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20  QLITE_DONE);.   
23000 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
23010 74 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73  this is a releas
23020 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f  e of the outermo
23030 73 74 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72  st savepoint, tr
23040 75 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74  uncate .    ** t
23050 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
23060 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65 77 3d  */.    if( nNew=
23070 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  =0 && op==SAVEPO
23080 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26 20 70  INT_RELEASE && p
23090 50 61 67 65 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65  Pager->sjfd->pMe
230a0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61  thods ){.      a
230b0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
230c0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63  E_OK );.      rc
230d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
230e0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  cate(pPager->sjf
230f0 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  d, 0);.      pPa
23100 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
23110 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
23120 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23130 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
23140 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
23150 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23160 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
23170 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
23180 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
23190 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
231a0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
231b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
231c0 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74  n the VFS struct
231d0 75 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ure for the page
231e0 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69  r..*/.const sqli
231f0 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33  te3_vfs *sqlite3
23200 50 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a  PagerVfs(Pager *
23210 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
23220 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  n pPager->pVfs;.
23230 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23240 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
23250 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
23260 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
23270 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67  .** with the pag
23280 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
23290 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  return NULL if t
232a0 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e  he file has.** n
232b0 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
232c0 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66  ed..*/.sqlite3_f
232d0 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  ile *sqlite3Page
232e0 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61  rFile(Pager *pPa
232f0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
23300 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a  Pager->fd;.}../*
23310 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
23320 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
23330 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
23340 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
23350 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d  lite3PagerDirnam
23360 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
23370 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
23380 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d  r->zDirectory;.}
23390 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
233a0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
233b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
233c0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
233d0 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
233e0 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67  rJournalname(Pag
233f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
23400 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a  eturn pPager->zJ
23410 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ournal;.}../*.**
23420 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
23430 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72  fsync() calls ar
23440 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74  e disabled for t
23450 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75  his pager.  Retu
23460 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66  rn FALSE.** if f
23470 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63  sync()s are exec
23480 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a  uted normally..*
23490 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
234a0 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  erNosync(Pager *
234b0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
234c0 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
234d0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
234e0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
234f0 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63  ** Set the codec
23500 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
23510 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
23520 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20  agerSetCodec(.  
23530 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
23540 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
23550 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
23560 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  o,int),.  void *
23570 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70  pCodecArg.){.  p
23580 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20  Pager->xCodec = 
23590 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72  xCodec;.  pPager
235a0 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43  ->pCodecArg = pC
235b0 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69  odecArg;.}.#endi
235c0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
235d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
235e0 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  M./*.** Move the
235f0 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63   page pPg to loc
23600 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68  ation pgno in th
23610 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
23620 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72  ere must be no r
23630 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
23640 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79   page previously
23650 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70   located at.** p
23660 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61  gno (which we ca
23670 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67  ll pPgOld) thoug
23680 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61  h that page is a
23690 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20  llowed to be.** 
236a0 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68  in cache.  If th
236b0 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
236c0 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e  y located at pgn
236d0 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  o is not already
236e0 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  .** in the rollb
236f0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ack journal, it 
23700 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65  is not put there
23710 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74   by by this rout
23720 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ine..**.** Refer
23730 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
23740 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c  e pPg remain val
23750 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79  id. Updating any
23760 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73  .** meta-data as
23770 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
23780 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f  g (i.e. data sto
23790 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72  red in the nExtr
237a0 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63  a bytes.** alloc
237b0 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
237c0 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65  the page) is the
237d0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
237e0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  of the caller..*
237f0 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
23800 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  on must be activ
23810 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
23820 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49  ine is called. I
23830 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20  t used to be.** 
23840 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20  required that a 
23850 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
23860 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63  ction was not ac
23870 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72  tive, but this r
23880 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61  estriction.** ha
23890 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28  s been removed (
238a0 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65  CREATE INDEX nee
238b0 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67  ds to move a pag
238c0 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  e when a stateme
238d0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
238e0 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a  n is active)..**
238f0 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74  .** If the fourt
23900 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f  h argument, isCo
23910 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72  mmit, is non-zer
23920 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  o, then this pag
23930 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f  e is being.** mo
23940 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  ved as part of a
23950 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67 61   database reorga
23960 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65  nization just be
23970 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
23980 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e  tion .** is bein
23990 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20  g committed. In 
239a0 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69 73  this case, it is
239b0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
239c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
239d0 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72  ge .** pPg refer
239e0 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s to will not be
239f0 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69   written to agai
23a00 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
23a10 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
23a20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
23a30 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
23a40 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
23a50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e  g, Pgno pgno, in
23a60 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  t isCommit){.  P
23a70 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f  gHdr *pPgOld;  /
23a80 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
23a90 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
23aa0 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
23ab0 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Pgno = 0;..  ass
23ac0 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
23ad0 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43   );..  PAGERTRAC
23ae0 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
23af0 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
23b00 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
23b10 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
23b20 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
23b30 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73  gno, (pPg->flags
23b40 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
23b50 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 3b 0a 20 20  )?1:0, pgno);.  
23b60 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
23b70 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
23b80 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
23b90 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67  gno))..  pager_g
23ba0 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
23bb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f  ..  /* If the jo
23bc0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
23bd0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
23be0 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
23bf0 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69   can.  ** be wri
23c00 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70  tten to, store p
23c10 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61  Pg->pgno in loca
23c20 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53  l variable needS
23c30 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20  yncPgno..  **.  
23c40 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d  ** If the isComm
23c50 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  it flag is set, 
23c60 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
23c70 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
23c80 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  t.  ** the journ
23c90 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
23ca0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
23cb0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 50 67  atabase page pPg
23cc0 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e  ->pgno .  ** can
23cd0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
23ce0 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
23cf0 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
23d00 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
23d10 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  it..  */.  if( (
23d20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
23d30 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21  _NEED_SYNC) && !
23d40 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
23d50 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
23d60 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
23d70 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72  sert( pageInJour
23d80 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  nal(pPg) || pPg-
23d90 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
23da0 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
23db0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
23dc0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
23dd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
23de0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
23df0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
23e00 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
23e10 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
23e20 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
23e30 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
23e40 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61  rom its hash cha
23e50 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
23e60 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
23e70 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
23e80 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
23e90 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
23ea0 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
23eb0 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
23ec0 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
23ed0 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
23ee0 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61  .  */.  pPg->fla
23ef0 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
23f00 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64  D_SYNC;.  pPgOld
23f10 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
23f20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
23f30 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64   assert( !pPgOld
23f40 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66   || pPgOld->nRef
23f50 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67  ==1 );.  if( pPg
23f60 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  Old ){.    pPg->
23f70 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64  flags |= (pPgOld
23f80 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
23f90 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a 0a 20  ED_SYNC);.  }.. 
23fa0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f   sqlite3PcacheMo
23fb0 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  ve(pPg, pgno);. 
23fc0 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
23fd0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
23fe0 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20  Drop(pPgOld);.  
23ff0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  }..  sqlite3Pcac
24000 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
24010 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74  ;.  pPager->dirt
24020 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 70 50  yCache = 1;.  pP
24030 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
24040 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
24050 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
24060 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
24070 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
24080 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
24090 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
240a0 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
240b0 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
240c0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
240d0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
240e0 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
240f0 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
24100 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
24110 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
24120 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
24130 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a  he .    ** "is j
24140 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63  ournaled" bitvec
24150 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73   flag has been s
24160 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74  et. This needs t
24170 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79  o be remedied by
24180 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20  .    ** loading 
24190 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
241a0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
241b0 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  d setting the Pg
241c0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20  Hdr.needSync .  
241d0 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a    ** flag..    *
241e0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
241f0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
24200 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
24210 65 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69  e page-cache fai
24220 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20  ls, (due.    ** 
24230 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  to a malloc() or
24240 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c   IO failure), cl
24250 65 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74  ear the bit in t
24260 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a  he pInJournal[].
24270 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74      ** array. Ot
24280 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
24290 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61  page is loaded a
242a0 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e  nd written again
242b0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   in.    ** this 
242c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
242d0 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74  may be written t
242e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
242f0 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ile before.    *
24300 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69  * it is synced i
24310 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
24320 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20  file. This way, 
24330 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e  it may end up in
24340 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
24350 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20  nal file twice, 
24360 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  but that is not 
24370 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a  a problem..    *
24380 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
24390 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63  ite3PagerGet() c
243a0 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68  all may cause th
243b0 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e  e journal to syn
243c0 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  c. So make.    *
243d0 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72  * sure the Pager
243e0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
243f0 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a  s set too..    *
24400 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  /.    int rc;.  
24410 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
24420 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24430 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
24440 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24450 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
24460 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
24470 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
24480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24490 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
244a0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
244b0 26 26 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c  && needSyncPgno<
244c0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
244d0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ize ){.        s
244e0 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61  qlite3BitvecClea
244f0 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  r(pPager->pInJou
24500 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67  rnal, needSyncPg
24510 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
24520 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24530 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
24540 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
24550 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24560 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21  ->noSync==0 && !
24570 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67  MEMDB );.    pPg
24580 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  Hdr->flags |= PG
24590 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
245a0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
245b0 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  MakeDirty(pPgHdr
245c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
245d0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
245e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
245f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
24600 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
24610 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
24620 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
24630 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
24640 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
24650 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50  PagerGetData(DbP
24660 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  age *pPg){.  ass
24670 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
24680 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d   || pPg->pPager-
24690 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75  >memDb );.  retu
246a0 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d  rn pPg->pData;.}
246b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
246c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
246d0 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
246e0 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70  es of "extra" sp
246f0 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ace .** allocate
24700 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
24710 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
24720 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
24730 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44  3PagerGetExtra(D
24740 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
24750 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
24760 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65  Pg->pPager;.  re
24770 74 75 72 6e 20 28 70 50 61 67 65 72 3f 70 50 67  turn (pPager?pPg
24780 2d 3e 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a  ->pExtra:0);.}..
24790 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
247a0 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66  e locking-mode f
247b0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
247c0 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
247d0 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66  ust be one.** of
247e0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
247f0 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f  DE_QUERY, PAGER_
24800 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
24810 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f  AL or .** PAGER_
24820 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
24830 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61  USIVE. If the pa
24840 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
24850 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74  QUERY, then.** t
24860 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
24870 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
24880 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
24890 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
248a0 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  d value is eithe
248b0 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  r PAGER_LOCKINGM
248c0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a  ODE_NORMAL or.**
248d0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
248e0 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e  DE_EXCLUSIVE, in
248f0 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72  dicating the cur
24900 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
24910 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69  pdated).** locki
24920 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  ng-mode..*/.int 
24930 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
24940 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  ingMode(Pager *p
24950 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
24960 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
24970 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
24980 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  GMODE_QUERY.    
24990 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
249a0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
249b0 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  ODE_NORMAL.     
249c0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
249d0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
249e0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
249f0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
24a00 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
24a10 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Y<0 );.  assert(
24a20 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
24a30 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20  DE_NORMAL>=0 && 
24a40 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
24a50 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29  E_EXCLUSIVE>=0 )
24a60 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
24a70 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
24a80 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
24a90 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
24aa0 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a  de = (u8)eMode;.
24ab0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
24ac0 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
24ad0 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iveMode;.}../*.*
24ae0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f  * Get/set the jo
24af0 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74  urnal-mode for t
24b00 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
24b10 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
24b20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  be one of:.**.**
24b30 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
24b40 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20  LMODE_QUERY.**  
24b50 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
24b60 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20  ODE_DELETE.**   
24b70 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
24b80 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20  DE_TRUNCATE.**  
24b90 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
24ba0 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20  ODE_PERSIST.**  
24bb0 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
24bc0 4f 44 45 5f 4f 46 46 0a 2a 2a 0a 2a 2a 20 49 66  ODE_OFF.**.** If
24bd0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
24be0 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
24bf0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  en the journal-m
24c00 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
24c10 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69  e.** value speci
24c20 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
24c30 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74  returned indicat
24c40 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  e the current (p
24c50 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
24c60 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  .** journal-mode
24c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24c80 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
24c90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24ca0 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 69 66  int eMode){.  if
24cb0 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
24cc0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
24cd0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
24ce0 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
24cf0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
24d00 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
24d10 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20  _DELETE.        
24d20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
24d30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
24d40 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20  E_TRUNCATE.     
24d50 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
24d60 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
24d70 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
24d80 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
24d90 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
24da0 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
24db0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
24dc0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
24dd0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
24de0 20 20 20 20 61 73 73 65 72 74 28 20 50 41 47 45      assert( PAGE
24df0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
24e00 45 52 59 3c 30 20 29 3b 0a 20 20 20 20 69 66 28  ERY<0 );.    if(
24e10 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20   eMode>=0 ){.   
24e20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
24e30 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  alMode = (u8)eMo
24e40 64 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  de;.    }else{. 
24e50 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f       assert( eMo
24e60 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
24e70 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29 3b 0a 20  LMODE_QUERY );. 
24e80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
24e90 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a  n (int)pPager->j
24ea0 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f  ournalMode;.}../
24eb0 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
24ec0 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64   size-limit used
24ed0 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20   for persistent 
24ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
24ef0 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67  /.i64 sqlite3Pag
24f00 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  erJournalSizeLim
24f10 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
24f20 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20  , i64 iLimit){. 
24f30 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20   if( iLimit>=-1 
24f40 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
24f50 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
24f60 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  = iLimit;.  }.  
24f70 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a  return pPager->j
24f80 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
24f90 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
24fa0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
24fb0 20 2a 2f 0a                                       */.