/ Hex Artifact Content
Login

Artifact 9023042d50d961cfcaad4e9211eea711abb2b7f4:


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 32 39  : pager.c,v 1.29
0350: 34 20 32 30 30 37 2f 30 33 2f 32 34 20 31 36 3a  4 2007/03/24 16:
0360: 34 35 3a 30 35 20 64 61 6e 69 65 6c 6b 31 39 37  45:05 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 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0450: 6e 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69  ntf printf.#defi
0460: 6e 65 20 54 52 41 43 45 31 28 58 29 20 20 20 20  ne TRACE1(X)    
0470: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0480: 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69 6e 65  rintf(X).#define
0490: 20 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20   TRACE2(X,Y)    
04a0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04b0: 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  ntf(X,Y).#define
04c0: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20   TRACE3(X,Y,Z)  
04d0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04e0: 6e 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69  ntf(X,Y,Z).#defi
04f0: 6e 65 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  ne TRACE4(X,Y,Z,
0500: 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  W) sqlite3DebugP
0510: 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a 23  rintf(X,Y,Z,W).#
0520: 64 65 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c  define TRACE5(X,
0530: 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33  Y,Z,W,V) sqlite3
0540: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
0550: 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65  Z,W,V).#else.#de
0560: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23  fine TRACE1(X).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0580: 59 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  Y).#define TRACE
0590: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05a0: 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29   TRACE4(X,Y,Z,W)
05b0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 35 28  .#define TRACE5(
05c0: 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69  X,Y,Z,W,V).#endi
05d0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
05e0: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
05f0: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
0600: 6e 20 74 68 65 20 54 52 41 43 45 58 28 29 20 6d  n the TRACEX() m
0610: 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74  acros above.** t
0620: 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65  o print out file
0630: 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a  -descriptors. .*
0640: 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74  *.** PAGERID() t
0650: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
0660: 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74  o a Pager struct
0670: 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e   as it's argumen
0680: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
0690: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
06a0: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
06b0: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
06c0: 20 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65   takes an OsFile
06d0: 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74  .** struct as it
06e0: 27 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  's argument..*/.
06f0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0700: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0710: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0720: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0730: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0740: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0750: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0760: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0770: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0780: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
0790: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07a0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07b0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07c0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
07f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0800: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0820: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0830: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0840: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0850: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0860: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0870: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0880: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
0890: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08a0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08b0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08d0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08e0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
08f0: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0910: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0920: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0930: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0960: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0970: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0980: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
0990: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09b0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09e0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
09f0: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a00: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a20: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a30: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a40: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a60: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a70: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a80: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0a90: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ac0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ad0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0af0: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b00: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b10: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b20: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b30: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b40: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b60: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b70: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b80: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bb0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bc0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0bd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0be0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0bf0: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c00: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c10: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c20: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c30: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c40: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c70: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c80: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0c90: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cb0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cc0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0cd0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d00: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d10: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74  o is to remove t
0d20: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
0d40: 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65  nal file and the
0d50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
0d60: 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  l be.**         
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
0d80: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0d90: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0da0: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0db0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0dc0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0dd0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0de0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0df0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0e00: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0e10: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0e20: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0e30: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0e40: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0e50: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0e60: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0e70: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0e80: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0e90: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0ea0: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0eb0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0ec0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0ed0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0ee0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0ef0: 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29  ite_page_write()
0f00: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0f10: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0f20: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0f30: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0f40: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0f50: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0f60: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0f70: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0f80: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0f90: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0fa0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0fb0: 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20 62  VE occurs when b
0fc0: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
0fd0: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
0fe0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
0ff0: 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73 71  le.  After an sq
1000: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1010: 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74  ck().** or sqlit
1020: 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e_pager_commit()
1030: 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f 65 73  , the state goes
1040: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
1050: 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66 69 6e  HARED..*/.#defin
1060: 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20  e PAGER_UNLOCK  
1070: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41      0.#define PA
1080: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
1090: 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53  1   /* same as S
10a0: 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  HARED_LOCK */.#d
10b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45  efine PAGER_RESE
10c0: 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73  RVED    2   /* s
10d0: 61 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f  ame as RESERVED_
10e0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
10f0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1100: 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    4   /* same as
1110: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
1120: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1130: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a  _SYNCED      5..
1140: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  /*.** If the SQL
1150: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
1160: 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20  D_LOCK macro is 
1170: 73 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 63  set to true at c
1180: 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20  ompile-time,.** 
1190: 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74 74 65  then failed atte
11a0: 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20 72 65  mpts to get a re
11b0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c  served lock will
11c0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
11d0: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68   callback..** Th
11e0: 69 73 20 69 73 20 6f 66 66 20 62 79 20 64 65 66  is is off by def
11f0: 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20 77 68  ault.  To see wh
1200: 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  y, consider the 
1210: 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72  following scenar
1220: 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f  io:.** .** Suppo
1230: 73 65 20 74 68 72 65 61 64 20 41 20 61 6c 72 65  se thread A alre
1240: 61 64 79 20 68 61 73 20 61 20 73 68 61 72 65 64  ady has a shared
1250: 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20   lock and wants 
1260: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1270: 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61 6c 72  .** Thread B alr
1280: 65 61 64 79 20 68 61 73 20 61 20 72 65 73 65 72  eady has a reser
1290: 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  ved lock and wan
12a0: 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ts an exclusive 
12b0: 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74  lock.  If.** bot
12c0: 68 20 74 68 72 65 61 64 73 20 61 72 65 20 75 73  h threads are us
12d0: 69 6e 67 20 74 68 65 69 72 20 62 75 73 79 20 63  ing their busy c
12e0: 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69 67  allbacks, it mig
12f0: 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d  ht be a long tim
1300: 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20  e.** be for one 
1310: 6f 66 20 74 68 65 20 74 68 72 65 61 64 73 20 67  of the threads g
1320: 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77  ive up and allow
1330: 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f 20 70  s the other to p
1340: 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69  roceed..** But i
1350: 66 20 74 68 65 20 74 68 72 65 61 64 20 74 72 79  f the thread try
1360: 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65 20 72  ing to get the r
1370: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67 69 76  eserved lock giv
1380: 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a  es up quickly.**
1390: 20 28 69 66 20 69 74 20 6e 65 76 65 72 20 69 6e   (if it never in
13a0: 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79 20 63  vokes its busy c
13b0: 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20 74 68  allback) then th
13c0: 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c  e contention wil
13d0: 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64  l be.** resolved
13e0: 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66   quickly..*/.#if
13f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55 53 59  ndef SQLITE_BUSY
1400: 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23  _RESERVED_LOCK.#
1410: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42   define SQLITE_B
1420: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1430: 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 0.#endif../*.*
1440: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72 6f 75  * This macro rou
1450: 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20 73 6f  nds values up so
1460: 20 74 68 61 74 20 69 66 20 74 68 65 20 76 61 6c   that if the val
1470: 75 65 20 69 73 20 61 6e 20 61 64 64 72 65 73 73  ue is an address
1480: 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e   it.** is guaran
1490: 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 61 64  teed to be an ad
14a0: 64 72 65 73 73 20 74 68 61 74 20 69 73 20 61 6c  dress that is al
14b0: 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79  igned to an 8-by
14c0: 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a  te boundary..*/.
14d0: 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c  #define FORCE_AL
14e0: 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 28  IGNMENT(X)   (((
14f0: 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a  X)+7)&~7)../*.**
1500: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1510: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1520: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1530: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1540: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1550: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1560: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1570: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1580: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1590: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
15a0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
15b0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
15c0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
15d0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
15e0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
15f0: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1600: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1610: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1620: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1630: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1640: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1650: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1660: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1670: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1680: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1690: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
16a0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
16b0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
16c0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
16d0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
16e0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
16f0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1700: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1710: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1720: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1730: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1740: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1750: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1760: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1770: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1780: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1790: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
17a0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
17b0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
17c0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
17d0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
17e0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
17f0: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1800: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1810: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1830: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1840: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1850: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1860: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1870: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1880: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
1890: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
18a0: 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75  gHdr PgHdr;.stru
18b0: 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67  ct PgHdr {.  Pag
18c0: 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18e0: 68 65 20 70 61 67 65 72 20 74 6f 20 77 68 69 63  he pager to whic
18f0: 68 20 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f  h this page belo
1900: 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
1910: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1920: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1930: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
1940: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
1950: 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20  Hdr *pNextHash, 
1960: 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20  *pPrevHash;  /* 
1970: 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  Hash collision c
1980: 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70  hain for PgHdr.p
1990: 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  gno */.  PgHdr *
19a0: 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65  pNextFree, *pPre
19b0: 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c  vFree;  /* Freel
19c0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68 65  ist of pages whe
19d0: 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20  re nRef==0 */.  
19e0: 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b  PgHdr *pNextAll;
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a00: 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
1a10: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
1a20: 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50   *pNextStmt, *pP
1a30: 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73  revStmt;  /* Lis
1a40: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
1a50: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1a60: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f  nal */.  u8 inJo
1a70: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
1a80: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1a90: 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  if has been writ
1aa0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
1ab0: 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20  /.  u8 inStmt;  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e     /* TRUE if in
1ae0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
1af0: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  ubjournal */.  u
1b00: 38 20 64 69 72 74 79 3b 20 20 20 20 20 20 20 20  8 dirty;        
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b20: 20 54 52 55 45 20 69 66 20 77 65 20 6e 65 65 64   TRUE if we need
1b30: 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63   to write back c
1b40: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e  hanges */.  u8 n
1b50: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
1b70: 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  nc journal befor
1b80: 65 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 70  e writing this p
1b90: 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61  age */.  u8 alwa
1ba0: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  ysRollback;     
1bb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
1bc0: 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  le dont_rollback
1bd0: 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  () for this page
1be0: 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20   */.  short int 
1bf0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1c00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c10: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
1c20: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
1c30: 2a 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44  *pDirty, *pPrevD
1c40: 69 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74  irty;    /* Dirt
1c50: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32  y pages */.  u32
1c60: 20 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20   notUsed;       
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1c80: 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23  uffer space */.#
1c90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1ca0: 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70  CK_PAGES.  u32 p
1cb0: 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a  ageHash;.#endif.
1cc0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67    /* pPager->pag
1cd0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70  eSize bytes of p
1ce0: 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  age data follow 
1cf0: 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20  this header */. 
1d00: 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61   /* Pager.nExtra
1d10: 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20   bytes of local 
1d20: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20  data follow the 
1d30: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a  page data */.};.
1d40: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  ./*.** For an in
1d50: 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74  -memory only dat
1d60: 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72  abase, some extr
1d70: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  a information is
1d80: 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a   recorded about.
1d90: 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f 20  ** each page so 
1da0: 74 68 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e  that changes can
1db0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1dc0: 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73    (Journal files
1dd0: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64   are not.** used
1de0: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   for in-memory d
1df0: 61 74 61 62 61 73 65 73 2e 29 20 20 54 68 65 20  atabases.)  The 
1e00: 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d  following inform
1e10: 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74  ation is added t
1e20: 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  o.** the end of 
1e30: 65 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63  every EXTRA bloc
1e40: 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  k for in-memory 
1e50: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
1e60: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
1e70: 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  n could have bee
1e80: 6e 20 61 64 64 65 64 20 64 69 72 65 63 74 6c 79  n added directly
1e90: 20 74 6f 20 74 68 65 20 50 67 48 64 72 20 73 74   to the PgHdr st
1ea0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20  ructure..** But 
1eb0: 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61  then it would ta
1ec0: 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61 20 38  ke up an extra 8
1ed0: 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67   bytes of storag
1ee0: 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72  e on every PgHdr
1ef0: 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73  .** even for dis
1f00: 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  k-based database
1f10: 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74  s.  Splitting it
1f20: 20 6f 75 74 20 73 61 76 65 73 20 38 20 62 79 74   out saves 8 byt
1f30: 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  es.  This.** is 
1f40: 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f  only a savings o
1f50: 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65  f 0.8% but those
1f60: 20 70 65 72 63 65 6e 74 61 67 65 73 20 61 64 64   percentages add
1f70: 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20   up..*/.typedef 
1f80: 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79  struct PgHistory
1f90: 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75   PgHistory;.stru
1fa0: 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20  ct PgHistory {. 
1fb0: 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20   u8 *pOrig;     
1fc0: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65  /* Original page
1fd0: 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20   text.  Restore 
1fe0: 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c  to this on a ful
1ff0: 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  l rollback */.  
2000: 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  u8 *pStmt;     /
2010: 2a 20 54 65 78 74 20 61 73 20 69 74 20 77 61 73  * Text as it was
2020: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2030: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
2040: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b   statement */.};
2050: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
2060: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
2070: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
2080: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
2090: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
20a0: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
20b0: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
20c0: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
20d0: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
20e0: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
20f0: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
2100: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
2110: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
2120: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
2130: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
2140: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
2150: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
2160: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
2170: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
2180: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
2190: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
21a0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
21b0: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
21c0: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
21d0: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
21e0: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
21f0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2200: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2210: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2220: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2230: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
2240: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
2250: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
2260: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
2270: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
2280: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
2290: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
22a0: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
22b0: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
22c0: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
22d0: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
22e0: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
22f0: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2300: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
2310: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
2320: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2330: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2340: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
2350: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
2360: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
2370: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
2380: 52 55 50 54 2c 20 53 51 4c 49 54 45 5f 50 52 4f  RUPT, SQLITE_PRO
2390: 54 4f 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49  TOCOL.** or SQLI
23a0: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
23b0: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
23c0: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
23d0: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
23e0: 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e  ** and is return
23f0: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
2400: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
2410: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
2420: 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46   The.** SQLITE_F
2430: 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ULL return code 
2440: 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66  is slightly diff
2450: 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73  erent. It persis
2460: 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68  ts only until th
2470: 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73  e.** next succes
2480: 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73  sful rollback is
2490: 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
24a0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41  e pager cache. A
24b0: 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46  lso,.** SQLITE_F
24c0: 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66  ULL does not aff
24d0: 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  ect the sqlite3P
24e0: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71  agerGet() and sq
24f0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
2500: 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79  ().** APIs, they
2510: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
2520: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2530: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
2540: 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f   {.  u8 journalO
2550: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2560: 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
2570: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
2580: 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f  tors is valid */
2590: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61  .  u8 journalSta
25a0: 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  rted;          /
25b0: 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72  * True if header
25c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73   of journal is s
25d0: 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73  ynced */.  u8 us
25e0: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
25f0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
2600: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2610: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
2620: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
2630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2640: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
2650: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
2660: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  cks */.  u8 stmt
2670: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2680: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2690: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
26a0: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
26b0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
26c0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
26d0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
26e0: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
26f0: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2700: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2710: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2720: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2730: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
2740: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
2750: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2790: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
27a0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
27b0: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
27c0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
27d0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
27e0: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c  ness */.  u8 ful
27f0: 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20 20 20 20  l_fsync;        
2800: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 46 5f 46        /* Use F_F
2810: 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e 20 61 76  ULLFSYNC when av
2820: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20  ailable */.  u8 
2830: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
2840: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
2850: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
2860: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
2870: 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  c. */.  u8 tempF
2880: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2890: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
28a0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
28b0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
28c0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
28d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
28e0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
28f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2900: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2910: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2920: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2930: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2940: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2950: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2960: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2970: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2980: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2990: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
29a0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
29b0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
29c0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
29d0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
29e0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
29f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a00: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2a10: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2a20: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
2a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a40: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2a50: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2a60: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74  to jrnl */.  int
2a70: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2a90: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
2aa0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
2ab0: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ad0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2ae0: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
2af0: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
2b10: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
2b20: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
2b30: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a  */.  int stmtSiz
2b40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
2b60: 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20  base (in pages) 
2b70: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
2b80: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2bb0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ges written to t
2bc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2bd0: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
2bf0: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
2c00: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
2c10: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
2c20: 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20  nt stmtNRec;    
2c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c40: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
2c50: 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e  in stmt subjourn
2c60: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  al */.  int nExt
2c70: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
2c80: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
2c90: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
2ca0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2cb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  e */.  int pageS
2cc0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2cd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ce0: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2d20: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
2d30: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ges */.  int nMa
2d40: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2d50: 20 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74       /* High wat
2d60: 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65  er mark of nPage
2d70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2da0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2db0: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2dc0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2de0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2df0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
2e00: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
2e10: 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61  .  u8 *aInJourna
2e20: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
2e30: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
2e40: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
2e50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2e60: 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20    u8 *aInStmt;  
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e80: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2e90: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2ea0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
2eb0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
2ec0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2ed0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2ee0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2ef0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
2f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2f10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f20: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
2f30: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
2f40: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
2f50: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
2f60: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2f70: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c  */.  OsFile *fd,
2f80: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
2f90: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2fa0: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
2fb0: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
2fc0: 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b  .  OsFile *stfd;
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fe0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2ff0: 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  r for the statem
3000: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f  ent subjournal*/
3010: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
3020: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
3030: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
3040: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
3050: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
3060: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
3070: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
3080: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3090: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
30a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
30b0: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
30c0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
30d0: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
30e0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
30f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
3100: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
3110: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
3120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
3130: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
3140: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3150: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
3160: 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20   *pDirty;       
3170: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3180: 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
3190: 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  s */.  i64 journ
31a0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
31b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
31c0: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
31d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
31e0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
31f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3200: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
3210: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
3220: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
3230: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
3240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3250: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
3260: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
3270: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
3280: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
3290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
32a0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
32b0: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
32c0: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
32d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
32e0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
32f0: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
3300: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
3310: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3320: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3330: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3340: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3360: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
3370: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
3380: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
3390: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
33a0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
33b0: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
33c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
33d0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
33e0: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
33f0: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
3400: 44 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61  Destructor)(DbPa
3410: 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c  ge*,int); /* Cal
3420: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
3430: 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65  hen freeing page
3440: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  s */.  void (*xR
3450: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
3460: 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c  ,int);   /* Call
3470: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
3480: 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67  en reloading pag
3490: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a  es */.  void *(*
34a0: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
34b0: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
34c0: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
34d0: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
34e0: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
34f0: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
3500: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
3510: 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f  t to xCodec() */
3520: 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20  .  int nHash;   
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3540: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
3550: 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a  ger hash table *
3560: 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  /.  PgHdr **aHas
3570: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
3580: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
3590: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
35a0: 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66   to PgHdr */.#if
35b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
35c0: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
35d0: 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65  ENT.  Pager *pNe
35e0: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
35f0: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
3600: 20 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68   of pagers in th
3610: 69 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e  is thread */.#en
3620: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
3630: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
3640: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
3650: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
3660: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
3670: 2f 0a 20 20 75 33 32 20 69 43 68 61 6e 67 65 43  /.  u32 iChangeC
3680: 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
3690: 2f 2a 20 44 62 20 63 68 61 6e 67 65 2d 63 6f 75  /* Db change-cou
36a0: 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 63  nter for which c
36b0: 61 63 68 65 20 69 73 20 76 61 6c 69 64 20 2a 2f  ache is valid */
36c0: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b  .  u8 doNotSync;
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36e0: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65  * Boolean. While
36f0: 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70   true, do not sp
3700: 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f  ill the cache */
3710: 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d  .  u8 exclusiveM
3720: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
3730: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20  * Boolean. True 
3740: 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  if locking_mode=
3750: 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20  =EXCLUSIVE */.  
3760: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
3770: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
3780: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
3790: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
37a0: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 7d 3b 0a 0a  -counter */.};..
37b0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
37c0: 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64 20  TEST is defined 
37d0: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  then increment t
37e0: 68 65 20 76 61 72 69 61 62 6c 65 20 67 69 76 65  he variable give
37f0: 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 67 75  n in.** the argu
3800: 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ment.*/.#ifdef S
3810: 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65 66  QLITE_TEST.# def
3820: 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78 29  ine TEST_INCR(x)
3830: 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65    x++.#else.# de
3840: 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78  fine TEST_INCR(x
3850: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
3860: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3870: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3880: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3890: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
38a0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
38b0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
38c0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
38d0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
38e0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
38f0: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3900: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
3910: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
3920: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
3930: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3940: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
3950: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
3960: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3970: 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e  begin.** written
3980: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3990: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
39a0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
39b0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
39c0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
39d0: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
39e0: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
39f0: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3a00: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
3a10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
3a20: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
3a30: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
3a40: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
3a50: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
3a60: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3a70: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3a80: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3a90: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3aa0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3ab0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3ac0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
3ad0: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
3ae0: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
3af0: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
3b00: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
3b10: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
3b20: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
3b30: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
3b40: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
3b50: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
3b60: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
3b70: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
3b80: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
3b90: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
3ba0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
3bb0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
3bc0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3bd0: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
3be0: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
3bf0: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
3c00: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
3c10: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
3c20: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
3c30: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
3c40: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
3c50: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
3c60: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
3c70: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
3c80: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
3c90: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
3ca0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
3cb0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
3cc0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
3cd0: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
3ce0: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
3cf0: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
3d00: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
3d10: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
3d20: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
3d30: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
3d40: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
3d50: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
3d60: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
3d70: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
3d80: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
3d90: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
3da0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
3db0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
3dc0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
3dd0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
3de0: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
3df0: 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   and of each pag
3e00: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
3e10: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
3e20: 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * by the followi
3e30: 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64  ng macros..*/.#d
3e40: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
3e50: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
3e60: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
3e70: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
3e80: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3e90: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
3ea0: 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75  ger. In the futu
3eb0: 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62  re, this could b
3ec0: 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65  e.** set to some
3ed0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
3ee0: 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f   the disk contro
3ef0: 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74  ller. The import
3f00: 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ant.** character
3f10: 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74  istic is that it
3f20: 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a   is the same siz
3f30: 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74  e as a disk sect
3f40: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  or..*/.#define J
3f50: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
3f60: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
3f70: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
3f80: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
3f90: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
3fa0: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
3fb0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
3fc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
3fd0: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
3fe0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
3ff0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
4000: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
4010: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
4020: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
4030: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
4040: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
4050: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
4060: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
4070: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
4080: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4090: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
40a0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
40b0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
40c0: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
40d0: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
40e0: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41  * Page number PA
40f0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e  GER_MJ_PGNO is n
4100: 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20  ever used in an 
4110: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
4120: 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76  (it is.** reserv
4130: 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61  ed for working a
4140: 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f  round a windows/
4150: 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62  posix incompatib
4160: 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a  ility). It is.**
4170: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75   used in the jou
4180: 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20  rnal to signify 
4190: 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64  that the remaind
41a0: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
41b0: 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65  l file .** is de
41c0: 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67  voted to storing
41d0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
41e0: 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61  l name - there a
41f0: 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73  re no more pages
4200: 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b   to.** roll back
4210: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66  . See comments f
4220: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  or function writ
4230: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
4240: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
4250: 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45  ./* #define PAGE
4260: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45  R_MJ_PGNO(x) (PE
4270: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
4280: 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23  >pageSize)) */.#
4290: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
42a0: 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e  PGNO(x) ((PENDIN
42b0: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
42c0: 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a  eSize))+1)../*.*
42d0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
42e0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
42f0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
4300: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
4310: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
4320: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  647../*.** Enabl
4330: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4340: 74 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20  t tracking (for 
4350: 64 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a  debugging) here:
4360: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4370: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67  E_TEST.  int pag
4380: 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  er3_refinfo_enab
4390: 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  le = 0;.  static
43a0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69   void pager_refi
43b0: 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20  nfo(PgHdr *p){. 
43c0: 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e     static int cn
43d0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  t = 0;.    if( !
43e0: 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65  pager3_refinfo_e
43f0: 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a  nable ) return;.
4400: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4410: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  Printf(.       "
4420: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
4430: 3d 25 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f  =%p nRef=%-3d to
4440: 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  tal=%d\n",.     
4450: 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52    p->pgno, PGHDR
4460: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
4470: 6e 52 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d  nRef, p->pPager-
4480: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
4490: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
44a0: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
44b0: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
44c0: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
44d0: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
44e0: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
44f0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
4500: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  O(X).#endif.../*
4510: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
4520: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
4530: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e   hash table to N
4540: 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70  .  N must be a p
4550: 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a  ower.** of two..
4560: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4570: 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
4580: 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50  _table(Pager *pP
4590: 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  ager, int N){.  
45a0: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a  PgHdr **aHash, *
45b0: 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e  pPg;.  assert( N
45c0: 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d  >0 && (N&(N-1))=
45d0: 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20  =0 );.  aHash = 
45e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
45f0: 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e  zeof(aHash[0])*N
4600: 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d   );.  if( aHash=
4610: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  =0 ){.    /* Fai
4620: 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69  lure to rehash i
4630: 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20  s not an error. 
4640: 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65   It is only a pe
4650: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a  rformance hit. *
4660: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
4670: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
4680: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
4690: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
46a0: 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   N;.  pPager->aH
46b0: 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66  ash = aHash;.  f
46c0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
46d0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
46e0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
46f0: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28    int h;.    if(
4700: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
4710: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4720: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
4730: 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
4740: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  sh==0 );.      c
4750: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4760: 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f     h = pPg->pgno
4770: 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50   & (N-1);.    pP
4780: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61  g->pNextHash = a
4790: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28  Hash[h];.    if(
47a0: 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20   aHash[h] ){.   
47b0: 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72     aHash[h]->pPr
47c0: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
47d0: 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d    }.    aHash[h]
47e0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d   = pPg;.    pPg-
47f0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
4800: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
4810: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
4820: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
4830: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4840: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
4850: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
4860: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
4870: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4880: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
4890: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
48a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
48b0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
48c0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
48d0: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
48e0: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
48f0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
4900: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
4910: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
4920: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
4930: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4940: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4950: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4960: 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20   sizeof(ac));.  
4970: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4980: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
4990: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
49a0: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
49b0: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
49c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
49d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
49e0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
49f0: 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20  r into a string 
4a00: 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e  buffer in big-en
4a10: 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e  dian byte order.
4a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4a30: 70 75 74 33 32 62 69 74 73 28 63 68 61 72 20 2a  put32bits(char *
4a40: 61 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  ac, u32 val){.  
4a50: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
4a60: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
4a70: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
4a80: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
4a90: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
4aa0: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
4ab0: 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
4ac0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4ad0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
4ae0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4af0: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
4b00: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
4b10: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
4b20: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4b30: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4b50: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
4b60: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
4b70: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
4b80: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
4b90: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
4ba0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
4bb0: 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   ac, 4);.}../*.*
4bc0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
4bd0: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
4be0: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
4bf0: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
4c00: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
4c10: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
4c20: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
4c30: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
4c40: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
4c50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4c60: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
4c70: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
4c80: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
4c90: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
4ca0: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4cb0: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4cc0: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
4cd0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
4ce0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
4cf0: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
4d00: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
4d10: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a  ithin the pager.
4d20: 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72  ** code. The fir
4d30: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
4d40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4d50: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
4d60: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74   the.** second t
4d70: 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
4d80: 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
4d90: 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
4da0: 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20  I function. .** 
4db0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
4dc0: 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
4dd0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4de0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
4df0: 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
4e00: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4e10: 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f  ent is SQLITE_IO
4e20: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
4e30: 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52  UPT or SQLITE_PR
4e40: 4f 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65  OTOCOL,.** the e
4e50: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
4e60: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
4e70: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4e80: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
4e90: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
4ea0: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
4eb0: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
4ec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4ed0: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
4ee0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
4ef0: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
4f00: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
4f10: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
4f20: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
4f30: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
4f40: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
4f50: 0a 20 20 69 66 28 20 0a 20 20 20 20 72 63 32 3d  .  if( .    rc2=
4f60: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
4f70: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
4f80: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
4f90: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
4fa0: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4fb0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29  ITE_PROTOCOL.  )
4fc0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
4fd0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
4fe0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4ff0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
5000: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
5010: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
5020: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
5030: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
5040: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
5050: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
5060: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75  Hdr *pPage){.  u
5070: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
5080: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
5090: 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28   char *pData = (
50a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
50b0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
50c0: 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  age);.  for(i=0;
50d0: 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72   i<pPage->pPager
50e0: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29  ->pageSize; i++)
50f0: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
5100: 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a  sh+i)^pData[i];.
5110: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
5120: 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  h;.}../*.** The 
5130: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
5140: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
5150: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
5160: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
5170: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
5180: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
5190: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
51a0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
51b0: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
51c0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
51d0: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
51e0: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
51f0: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
5200: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
5210: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
5220: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
5230: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
5240: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
5250: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
5260: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
5270: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
5280: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
5290: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
52a0: 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69  MEMDB || pPg->di
52b0: 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50  rty || .      pP
52c0: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
52d0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
52e0: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
52f0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
5300: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
5310: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
5320: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5330: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
5340: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
5350: 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74  pen..** The mast
5360: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5370: 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f  name is read fro
5380: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
5390: 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72   file and .** wr
53a0: 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
53b0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
53c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20  sqliteMalloc(). 
53d0: 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20  *pzMaster is.** 
53e0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  set to point at 
53f0: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  the memory and S
5400: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
5410: 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
5420: 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65  st.** sqliteFree
5430: 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a  () *pzMaster..**
5440: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
5450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5460: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70  me is present *p
5470: 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74  zMaster is set t
5480: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
5490: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
54a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
54b0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f  dMasterJournal(O
54c0: 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  sFile *pJrnl, ch
54d0: 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a  ar **pzMaster){.
54e0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
54f0: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
5500: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
5510: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
5520: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
5530: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
5540: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
5550: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d  eader */..  *pzM
5560: 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63  aster = 0;..  rc
5570: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
5580: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
5590: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
55a0: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
55b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
55c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
55d0: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
55e0: 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  6);.  if( rc!=SQ
55f0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5600: 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65   rc;. .  rc = re
5610: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
5620: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
5630: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5640: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5650: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
5660: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  , &cksum);.  if(
5670: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5680: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5690: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
56a0: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
56b0: 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   8);.  if( rc!=S
56c0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
56d0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
56e0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
56f0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5700: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
5710: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65  pJrnl, szJ-16-le
5720: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5730: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5740: 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65   rc;..  *pzMaste
5750: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
5760: 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b  teMalloc(len+1);
5770: 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65  .  if( !*pzMaste
5780: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
5790: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
57a0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
57b0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70  OsRead(pJrnl, *p
57c0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
57d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
57e0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
57f0: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
5800: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
5810: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   0;.    return r
5820: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
5830: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
5840: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
5850: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5860: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
5870: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
5880: 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73  cksum -= (*pzMas
5890: 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69  ter)[i];.  }.  i
58a0: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
58b0: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
58c0: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
58d0: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
58e0: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
58f0: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
5900: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
5910: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5920: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
5930: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
5940: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
5950: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
5960: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
5970: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
5980: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
5990: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
59a0: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
59b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
59c0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
59d0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d  zMaster = 0;.  }
59e0: 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61  else{.    (*pzMa
59f0: 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ster)[len] = '\0
5a00: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
5a10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5a20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
5a30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
5a40: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
5a50: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
5a60: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
5a70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
5a80: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
5a90: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
5aa0: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
5ab0: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
5ac0: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
5ad0: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
5ae0: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
5af0: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
5b00: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
5b10: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
5b20: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
5b50: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5b60: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
5b70: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
5b80: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
5b90: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
5ba0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5bb0: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
5bc0: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
5bd0: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ** .*/.static in
5be0: 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  t seekJournalHdr
5bf0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
5c00: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
5c10: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
5c20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5c30: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
5c40: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
5c50: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5c60: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
5c70: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5c80: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
5c90: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
5ca0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5cb0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
5cc0: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
5cd0: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
5ce0: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
5cf0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
5d00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5d10: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72  ff = offset;.  r
5d20: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53  eturn sqlite3OsS
5d30: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
5d40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5d50: 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Off);.}../*.** T
5d60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5d70: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
5d80: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
5d90: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
5da0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
5db0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
5dc0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
5dd0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
5de0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
5df0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
5e00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
5e10: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
5e20: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
5e30: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
5e40: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
5e50: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
5e60: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
5e70: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
5e80: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
5e90: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
5ea0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
5eb0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
5ec0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
5ed0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
5ee0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
5ef0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
5f00: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
5f10: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
5f20: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
5f30: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
5f40: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
5f50: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
5f60: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
5f70: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
5f80: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
5f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5fa0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
5fb0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5fc0: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
5fd0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5fe0: 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72  ic)+16];.  int r
5ff0: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
6000: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20  ->stmtHdrOff==0 
6010: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
6020: 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67  tmtHdrOff = pPag
6030: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
6040: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b    }..  rc = seek
6050: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
6060: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
6070: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61  eturn rc;..  pPa
6080: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
6090: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
60a0: 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
60b0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
60c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
60d0: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20  ger);..  /* FIX 
60e0: 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50  ME: .  **.  ** P
60f0: 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61  ossibly for a pa
6100: 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79  ger not in no-sy
6110: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
6120: 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c  rnal magic shoul
6130: 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72  d not.  ** be wr
6140: 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63  itten until nRec
6150: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73   is filled in as
6160: 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79   part of next sy
6170: 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20  ncJournal(). .  
6180: 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
6190: 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65   maybe the whole
61a0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
61b0: 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65  should be delaye
61c0: 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a  d until that.  *
61d0: 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61  * point. Think a
61e0: 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  bout this..  */.
61f0: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
6200: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6210: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
6220: 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68  Magic));.  /* Th
6230: 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78  e nRec Field. 0x
6240: 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d  FFFFFFFF for no-
6250: 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a  sync journals. *
6260: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6270: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6280: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70  ournalMagic)], p
6290: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20  Pager->noSync ? 
62a0: 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29 3b  0xffffffff : 0);
62b0: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
62c0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
62d0: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71  ialiser */ .  sq
62e0: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
62f0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
6300: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
6310: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
6320: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6330: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
6340: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
6350: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6360: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
6370: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
6380: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
6390: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
63a0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
63b0: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  8], pPager->dbSi
63c0: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
63d0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
63e0: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
63f0: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
6400: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6410: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6420: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
6430: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f 54  ctorSize);.  IOT
6440: 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
6450: 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
6460: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
6470: 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 48  alHdr, sizeof(zH
6480: 65 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d 20  eader))).  rc = 
6490: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
64a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
64b0: 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
64c0: 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  der));..  /* The
64d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
64e0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
64f0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53   successfully. S
6500: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  eek the journal.
6510: 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
6520: 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  ptor to the end 
6530: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
6540: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
6550: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
6560: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49 4f  ITE_OK ){.    IO
6570: 54 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25 70  TRACE(("JTAIL %p
6580: 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
6590: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
65a0: 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63 20  lOff-1)).    rc 
65b0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
65c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
65d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
65e0: 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
65f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6600: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6610: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
6620: 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a  fd, "\000", 1);.
6630: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6640: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6650: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6660: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
6670: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
6680: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
6690: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
66a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
66b0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
66c0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
66d0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
66e0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
66f0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
6700: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
6710: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
6720: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
6730: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6740: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
6750: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
6760: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
6770: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
6780: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
6790: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
67a0: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
67b0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
67c0: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
67d0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
67e0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
67f0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
6800: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
6810: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
6820: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
6830: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
6840: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
6850: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6860: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
6870: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
6880: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
6890: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
68a0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
68b0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
68c0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
68d0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
68e0: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
68f0: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
6900: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
6910: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
6920: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
6930: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
6940: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
6950: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6960: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
6970: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
6980: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
6990: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
69a0: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
69b0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
69c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
69d0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
69e0: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
69f0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6a00: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
6a10: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6a20: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6a30: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6a40: 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
6a50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
6a60: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6a70: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
6a80: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
6a90: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
6aa0: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
6ab0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
6ac0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
6ad0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
6ae0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6af0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63   rc;..  if( memc
6b00: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6b10: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6b20: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
6b30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6b40: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
6b50: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6b60: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65  Pager->jfd, pNRe
6b70: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
6b80: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6b90: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6ba0: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
6bb0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
6bc0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6bd0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
6be0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6bf0: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
6c00: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6c10: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
6c20: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
6c30: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
6c40: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
6c50: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
6c60: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
6c70: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
6c80: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
6c90: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
6ca0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
6cb0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
6cc0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
6cd0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
6ce0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
6cf0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
6d00: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
6d10: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
6d20: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
6d30: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
6d40: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
6d50: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
6d60: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6d70: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  s(pPager->jfd, (
6d80: 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73  u32 *)&pPager->s
6d90: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
6da0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6db0: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
6dc0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
6dd0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6de0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6df0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
6e00: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
6e10: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75  rnalOff);.  retu
6e20: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
6e30: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
6e40: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
6e50: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
6e60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6e70: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
6e80: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
6e90: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
6ea0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6eb0: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
6ec0: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
6ed0: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
6ee0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
6ef0: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
6f00: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
6f10: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
6f20: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
6f30: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
6f40: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
6f50: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
6f60: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
6f70: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
6f80: 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  **.** + 4 bytes:
6f90: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
6fa0: 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65  ** + N bytes: le
6fb0: 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
6fc0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20  ournal name..** 
6fd0: 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20  + 4 bytes: N.** 
6fe0: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
6ff0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
7000: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20  hecksum..** + 8 
7010: 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
7020: 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
7030: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7040: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
7050: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
7060: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
7070: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
7080: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  name..**.** If z
7090: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
70a0: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
70b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
70c0: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
70d0: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
70e0: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
70f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
7100: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
7110: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
7120: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
7130: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
7140: 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74   int len; .  int
7150: 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d   i; .  u32 cksum
7160: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
7170: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
7180: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
7190: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
71a0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
71b0: 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  er) return SQLIT
71c0: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
71d0: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
71e0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
71f0: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
7200: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
7210: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
7220: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
7230: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
7240: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
7250: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
7260: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
7270: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
7280: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7290: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
72a0: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
72b0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
72c0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
72d0: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
72e0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
72f0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
7300: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
7310: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
7320: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
7330: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7340: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7350: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
7360: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
7370: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
7380: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
7390: 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a  r->jfd, PAGER_MJ
73a0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
73b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
73c0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
73d0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
73e0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
73f0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
7400: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
7410: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7420: 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74   rc;..  put32bit
7430: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
7440: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
7450: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
7460: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
7470: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
7480: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7490: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
74a0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
74b0: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
74c0: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
74d0: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
74e0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
74f0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
7500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7510: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
7520: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
7530: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
7540: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
7550: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
7560: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
7570: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
7580: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
7590: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
75a0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
75b0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
75c0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
75d0: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
75e0: 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
75f0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
7600: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
7610: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
7620: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
7630: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
7640: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
7650: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
7660: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
7670: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
7680: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
7690: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
76a0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
76b0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
76c0: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
76d0: 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75  g->inStmt ) retu
76e0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rn;.  assert( pP
76f0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20  g->pPrevStmt==0 
7700: 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  && pPg->pNextStm
7710: 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  t==0 );.  pPg->p
7720: 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20  PrevStmt = 0;.  
7730: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  if( pPager->pStm
7740: 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  t ){.    pPager-
7750: 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  >pStmt->pPrevStm
7760: 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  t = pPg;.  }.  p
7770: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
7780: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20  pPager->pStmt;. 
7790: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
77a0: 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53   pPg;.  pPg->inS
77b0: 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69  tmt = 1;.}.stati
77c0: 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f  c void page_remo
77d0: 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
77e0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
77f0: 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d   if( !pPg->inStm
7800: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  t ) return;.  if
7810: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
7820: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7830: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e  pPg->pPrevStmt->
7840: 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29  pNextStmt==pPg )
7850: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
7860: 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Stmt->pNextStmt 
7870: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
7880: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7890: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
78a0: 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29  er->pStmt==pPg )
78b0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
78c0: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e  r->pStmt = pPg->
78d0: 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20  pNextStmt;.  }. 
78e0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53   if( pPg->pNextS
78f0: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
7900: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  t( pPg->pNextStm
7910: 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50  t->pPrevStmt==pP
7920: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  g );.    pPg->pN
7930: 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  extStmt->pPrevSt
7940: 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53  mt = pPg->pPrevS
7950: 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  tmt;.  }.  pPg->
7960: 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
7970: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
7980: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74  = 0;.  pPg->inSt
7990: 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mt = 0;.}../*.**
79a0: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
79b0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
79c0: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
79d0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
79e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
79f0: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
7a00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
7a10: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
7a20: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
7a30: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
7a40: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
7a50: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7a60: 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72  aHash==0 ) retur
7a70: 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65  n 0;.  p = pPage
7a80: 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20  r->aHash[pgno & 
7a90: 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
7aa0: 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26  )];.  while( p &
7ab0: 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20  & p->pgno!=pgno 
7ac0: 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  ){.    p = p->pN
7ad0: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72  extHash;.  }.  r
7ae0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
7af0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
7b00: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
7b10: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
7b20: 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
7b30: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70  Pager){.  if( !p
7b40: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
7b50: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Mode ){.    if( 
7b60: 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
7b70: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7b80: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7b90: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67  OCK);.      pPag
7ba0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
7bb0: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
7bc0: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
7bd0: 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20  Pager)).    }.  
7be0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7bf0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7c00: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
7c10: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
7c20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
7c30: 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
7c40: 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
7c50: 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
7c60: 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
7c70: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
7c80: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
7c90: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
7ca0: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a  lready entered.*
7cb0: 2a 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  * the error-stat
7cc0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7cd0: 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
7ce0: 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
7cf0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
7d00: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
7d10: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
7d20: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
7d30: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
7d40: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
7d50: 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
7d60: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
7d70: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a  lock(pPager);.}.
7d80: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
7d90: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
7da0: 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d  clear the in-mem
7db0: 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73  ory cache.  This
7dc0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73   routine.** sets
7dd0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
7de0: 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20  e pager back to 
7df0: 77 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e  what it was when
7e00: 20 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a   it was first.**
7e10: 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75   opened.  Any ou
7e20: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
7e30: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20  are invalidated 
7e40: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61  and subsequent a
7e50: 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63  ttempts.** to ac
7e60: 63 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73  cess those pages
7e70: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
7e80: 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
7e90: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
7ea0: 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
7eb0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7ec0: 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
7ed0: 78 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  xt;.  if( pPager
7ee0: 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
7ef0: 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  rn;.  for(pPg=pP
7f00: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
7f10: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
7f20: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
7f30: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  extAll;.    sqli
7f40: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  teFree(pPg);.  }
7f50: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
7f60: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7f70: 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50  pFirst = 0;.  pP
7f80: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
7f90: 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
7fa0: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  ->pLast = 0;.  p
7fb0: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b  Pager->pAll = 0;
7fc0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  .  pPager->nHash
7fd0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72   = 0;.  sqliteFr
7fe0: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
7ff0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  );.  pPager->nPa
8000: 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ge = 0;.  pPager
8010: 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70  ->aHash = 0;.  p
8020: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
8030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
8040: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8050: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
8060: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
8070: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
8080: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
8090: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
80a0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
80b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
80c0: 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61  leases.** the da
80d0: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
80e0: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
80f0: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
8100: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
8110: 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c  l.** file is del
8120: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
8130: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
8140: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
8150: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
8160: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
8170: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
8180: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
8190: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
81a0: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
81b0: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
81c0: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
81d0: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
81e0: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
81f0: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
8200: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
8210: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
8220: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
8230: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
8240: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
8250: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8260: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
8270: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
8280: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8290: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
82a0: 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
82b0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
82c0: 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
82d0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
82e0: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
82f0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
8300: 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  pen = 0;.  }.  i
8310: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
8320: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66  alOpen ){.    if
8330: 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
8340: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
8350: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
8360: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8370: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8380: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
8390: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  jfd, 0);.      p
83a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
83b0: 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
83c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
83d0: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
83e0: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
83f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
8400: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
8410: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
8420: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
8430: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
8440: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
8450: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
8460: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
8470: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
8480: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
8490: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
84a0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
84b0: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
84c0: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
84d0: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
84e0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
84f0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77  ;.      pPg->alw
8500: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
8510: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
8520: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
8530: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
8540: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
8550: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
8560: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
8570: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
8580: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
8590: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
85a0: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
85b0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
85c0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
85d0: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rnal==0 );.    a
85e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
85f0: 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
8600: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
8610: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69  al==0 );.  }.  i
8620: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
8630: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
8640: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55   rc = sqlite3OsU
8650: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
8660: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
8670: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
8680: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
8690: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72  ;.    pPager->or
86a0: 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20  igDbSize = 0;.  
86b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
86c0: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
86d0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
86e0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
86f0: 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
8700: 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  e;.    pPager->a
8710: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
8720: 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
8730: 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
8740: 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
8750: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b  r->aInJournal ){
8760: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
8770: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
8780: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
8790: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
87a0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
87b0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
87c0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
87d0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
87e0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
87f0: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   -1;.  return rc
8800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
8810: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
8820: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
8830: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
8840: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
8850: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
8860: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
8870: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
8880: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
8890: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
88a0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
88b0: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
88c0: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
88d0: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
88e0: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
88f0: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
8900: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
8910: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
8920: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
8930: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
8940: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
8950: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
8960: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
8970: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
8980: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
8990: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
89a0: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
89b0: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
89c0: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
89d0: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
89e0: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
89f0: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
8a00: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
8a10: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
8a20: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
8a30: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
8a40: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
8a50: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
8a60: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
8a70: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
8a80: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
8a90: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
8aa0: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
8ab0: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
8ac0: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
8ad0: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
8ae0: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
8af0: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
8b00: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
8b10: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
8b20: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
8b30: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
8b40: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
8b50: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
8b60: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
8b70: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
8b80: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
8b90: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
8ba0: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
8bb0: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
8bc0: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
8bd0: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
8be0: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
8bf0: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
8c00: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
8c10: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
8c20: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
8c30: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
8c40: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
8c50: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
8c60: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
8c70: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
8c80: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
8c90: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
8ca0: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
8cb0: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
8cc0: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
8cd0: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46  n cksum;.}../* F
8ce0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
8cf0: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
8d00: 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
8d10: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
8d20: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
8d30: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
8d40: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
8d50: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
8d60: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
8d70: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
8d80: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
8d90: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
8da0: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
8db0: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
8dc0: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
8dd0: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
8de0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8df0: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
8e00: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
8e10: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
8e20: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
8e30: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
8e40: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
8e50: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50  yback_one_page(P
8e60: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73  ager *pPager, Os
8e70: 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75  File *jfd, int u
8e80: 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20  seCksum){.  int 
8e90: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
8ea0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8eb0: 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
8ec0: 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
8ed0: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
8ee0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
8ef0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
8f00: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
8f10: 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
8f20: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
8f50: 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
8f60: 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20  hecking */.  u8 
8f70: 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70  *aData = (u8 *)p
8f80: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
8f90: 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ;   /* Temp stor
8fa0: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
8fb0: 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d  /..  /* useCksum
8fc0: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20   should be true 
8fd0: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  for the main jou
8fe0: 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66  rnal and false f
8ff0: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  or.  ** statemen
9000: 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72  t journals.  Ver
9010: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73  ify that this is
9020: 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
9030: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9040: 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d  jfd == (useCksum
9050: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
9060: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29   pPager->stfd) )
9070: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
9080: 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61  a );..  rc = rea
9090: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67  d32bits(jfd, &pg
90a0: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
90b0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
90c0: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
90d0: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
90e0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
90f0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
9100: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9110: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
9120: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9130: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
9140: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
9150: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
9160: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
9170: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
9180: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
9190: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
91a0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
91b0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
91c0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
91d0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
91e0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
91f0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
9200: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
9210: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
9220: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
9230: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
9240: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
9250: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
9260: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
9270: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
9280: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
9290: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
92a0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
92b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
92c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
92d0: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
92e0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
92f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9300: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
9310: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
9320: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9330: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
9340: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9350: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
9360: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
9370: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
9380: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
9390: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
93a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
93b0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
93c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
93d0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
93e0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
93f0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9400: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
9410: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
9420: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
9430: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
9440: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
9450: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
9460: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
9470: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
9480: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
9490: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
94a0: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
94b0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
94c0: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
94d0: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
94e0: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
94f0: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
9500: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
9510: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
9520: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
9530: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
9540: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
9550: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
9560: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
9570: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
9580: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
9590: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
95a0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
95b0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
95c0: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
95d0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
95e0: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
95f0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
9600: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
9610: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
9620: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
9630: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
9640: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
9650: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
9660: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
9670: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
9680: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
9690: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
96a0: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
96b0: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
96c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
96d0: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
96e0: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
96f0: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
9700: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
9710: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69  s are in the mai
9720: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
9730: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
9740: 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52  ise, if a full R
9750: 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61  OLLBACK occurs a
9760: 66 74 65 72 20 74 68 65 20 73 74 61 74 65 6d 65  fter the stateme
9770: 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  nt.  ** rollback
9780: 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41   the full ROLLBA
9790: 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74  CK will not rest
97a0: 6f 72 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ore the page to 
97b0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
97c0: 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20  * content.  Two 
97d0: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
97e0: 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  be met before wr
97f0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
9800: 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73  abase.  ** files
9810: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
9820: 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65  se must be locke
9830: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
9840: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
9850: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74  l.  ** page cont
9860: 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ent is in the ma
9870: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
9880: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
9890: 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a  ge is not in.  *
98a0: 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20  * cache or else 
98b0: 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
98c0: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
98d0: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
98e0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
98f0: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
9900: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
9910: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
9920: 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 54 52  | pPg!=0 );.  TR
9930: 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE3("PLAYBACK %
9940: 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
9950: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
9960: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67  gno);.  if( pPag
9970: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
9980: 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70  _EXCLUSIVE && (p
9990: 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65  Pg==0 || pPg->ne
99a0: 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20  edSync==0) ){.  
99b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
99c0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
99d0: 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
99e0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
99f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9a00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9a10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
9a20: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
9a30: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
9a40: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
9a50: 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a  .    if( pPg ){.
9a60: 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
9a70: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
9a80: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
9a90: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
9aa0: 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
9ab0: 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
9ac0: 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
9ad0: 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
9ae0: 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
9af0: 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
9b00: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
9b10: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
9b20: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
9b30: 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
9b40: 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
9b50: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
9b60: 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
9b70: 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
9b80: 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
9b90: 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
9ba0: 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
9bb0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
9bc0: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
9bd0: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
9be0: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
9bf0: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
9c00: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20  pPg->pgno==1 ); 
9c10: 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50  */.    pData = P
9c20: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
9c30: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  );.    memcpy(pD
9c40: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
9c50: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9c60: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
9c70: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f  Destructor ){  /
9c80: 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f  *** FIX ME:  Sho
9c90: 75 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69  uld this be xRei
9ca0: 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20  nit? ***/.      
9cb0: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
9cc0: 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  tor(pPg, pPager-
9cd0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9ce0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
9cf0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
9d00: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
9d10: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
9d20: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
9d30: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
9d40: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
9d50: 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   3);..    /* If 
9d60: 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c  this was page 1,
9d70: 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
9d80: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
9d90: 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 2a 2f  .iChangeCount */
9da0: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
9db0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
9dc0: 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d  ->iChangeCount =
9dd0: 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
9de0: 70 50 67 2c 20 32 34 29 3b 0a 20 20 20 20 7d 0a  pPg, 24);.    }.
9df0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
9e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
9e10: 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
9e20: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
9e30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9e40: 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
9e50: 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
9e60: 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
9e70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9e80: 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
9e90: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
9ea0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
9eb0: 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
9ec0: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
9ed0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9ee0: 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
9ef0: 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
9f00: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  is..**.** The ma
9f10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9f20: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
9f30: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c  ames of all chil
9f40: 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  d journals..** T
9f50: 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74  o tell if a mast
9f60: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
9f70: 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b  e deleted, check
9f80: 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a   to each of the.
9f90: 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66  ** children.  If
9fa0: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72   all children ar
9fb0: 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67  e either missing
9fc0: 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72   or do not refer
9fd0: 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65   to.** a differe
9fe0: 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nt master journa
9ff0: 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73  l, then this mas
a000: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
a010: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  be deleted..*/.s
a020: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
a030: 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20  delmaster(const 
a040: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
a050: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
a060: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
a070: 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65  .  OsFile *maste
a080: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
a090: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
a0a0: 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f  0; /* Contents o
a0b0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
a0c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e   file */.  i64 n
a0d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20  MasterJournal;  
a0e0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
a0f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a100: 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65  ile */..  /* Ope
a110: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
a120: 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73  rnal file exclus
a130: 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f  ively in case so
a140: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
a150: 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67  .  ** is running
a160: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
a170: 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20  so. Not that it 
a180: 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64  makes too much d
a190: 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a  ifference..  */.
a1a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a1b0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61  OpenReadOnly(zMa
a1c0: 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a  ster, &master);.
a1d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a1e0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a1f0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
a200: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72  er_open = 1;.  r
a210: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
a220: 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e  eSize(master, &n
a230: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a240: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a250: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a260: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
a270: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
a280: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
a290: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
a2a0: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
a2b0: 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  0;..    /* Load 
a2c0: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
a2d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
a2e0: 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
a2f0: 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
a300: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
a310: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
a320: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
a330: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
a340: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
a350: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
a360: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
a370: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
a380: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
a390: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a3a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
a3b0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
a3c0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
a3d0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61  sqlite3OsRead(ma
a3e0: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
a3f0: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
a400: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  rnal);.    if( r
a410: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
a420: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a430: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
a440: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
a450: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
a460: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
a470: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
a480: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
a490: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
a4a0: 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c  eExists(zJournal
a4b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
a4c0: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
a4d0: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
a4e0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
a4f0: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
a500: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
a510: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
a520: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
a530: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
a540: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
a550: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
a560: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
a570: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
a580: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a590: 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72      OsFile *jour
a5a0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nal = 0;.       
a5b0: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
a5c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
a5d0: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75  penReadOnly(zJou
a5e0: 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b  rnal, &journal);
a5f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
a600: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a610: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
a620: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
a630: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
a640: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
a650: 75 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26  urnal(journal, &
a660: 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  zMasterPtr);.   
a670: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
a680: 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(&journal);. 
a690: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
a6a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a6b0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
a6c0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
a6d0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d    }..        c =
a6e0: 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26   zMasterPtr!=0 &
a6f0: 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
a700: 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
a710: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a720: 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29  Free(zMasterPtr)
a730: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  ;.        if( c 
a740: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
a750: 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
a760: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
a770: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a780: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
a790: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
a7a0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
a7b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a7c0: 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74   zJournal += (st
a7d0: 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  rlen(zJournal)+1
a7e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
a7f0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
a800: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c  e(zMaster);..del
a810: 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66  master_out:.  if
a820: 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( zMasterJournal
a830: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
a840: 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
a850: 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
a860: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20  master_open ){. 
a870: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
a880: 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(&master);.  }.
a890: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a8a0: 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  #if 0./*.** Make
a8b0: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
a8c0: 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77  he cache agree w
a8d0: 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
a8e0: 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  isk.  In other w
a8f0: 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20  ords,.** reread 
a900: 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65  the disk to rese
a910: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
a920: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
a930: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a940: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72  called after a r
a950: 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68  ollback in which
a960: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72   some of the dir
a970: 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65  ty cache.** page
a980: 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e  s had never been
a990: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
a9a0: 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74  disk.  We need t
a9b0: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a  o roll back the.
a9c0: 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74  ** cache content
a9d0: 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74   and the easiest
a9e0: 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20   way to do that 
a9f0: 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  is to reread the
aa00: 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   old content.** 
aa10: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69  back from the di
aa20: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
aa30: 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  t pager_reload_c
aa40: 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
aa50: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
aa60: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
aa70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70  LITE_OK;.  for(p
aa80: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
aa90: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
aaa0: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68  NextAll){.    ch
aab0: 61 72 20 2a 7a 42 75 66 20 3d 20 70 50 61 67 65  ar *zBuf = pPage
aac0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
aad0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
aae0: 72 61 67 65 20 66 6f 72 20 6f 6e 65 20 70 61 67  rage for one pag
aaf0: 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  e */.    if( !pP
ab00: 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69  g->dirty ) conti
ab10: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e  nue;.    if( (in
ab20: 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
ab30: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
ab40: 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
ab50: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
ab60: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
ab70: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
ab80: 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a  (pPg->pgno-1));.
ab90: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
aba0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
abb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
abc0: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
abd0: 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
abe0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
abf0: 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33 28   }.      TRACE3(
ac00: 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65  "REFETCH %d page
ac10: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
ac20: 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
ac30: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
ac40: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
ac50: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
ac60: 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  zBuf, pPg->pgno,
ac70: 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   2);.    }else{.
ac80: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
ac90: 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  f, 0, pPager->pa
aca0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
acb0: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
acc0: 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42  ==0 || memcmp(zB
acd0: 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  uf, PGHDR_TO_DAT
ace0: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
acf0: 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
ad00: 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
ad10: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42  TO_DATA(pPg), zB
ad20: 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
ad30: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
ad40: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
ad50: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
ad60: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
ad70: 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
ad80: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  eSize);.      }e
ad90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
ada0: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
adb0: 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
adc0: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
add0: 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra);.      }.   
ade0: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64   }.    pPg->need
adf0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
ae00: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69  g->dirty = 0;.#i
ae10: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
ae20: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
ae30: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
ae40: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
ae50: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 50  .#endif.  }.  pP
ae60: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
ae70: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ae80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
ae90: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
aea0: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
aeb0: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
aec0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
aed0: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f  ** indicated..*/
aee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
aef0: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
af00: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
af10: 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
af20: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
af30: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
af40: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
af50: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
af60: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
af70: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
af80: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
af90: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
afa0: 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
afb0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
afc0: 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
afd0: 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
afe0: 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
aff0: 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
b000: 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
b010: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
b020: 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
b030: 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
b040: 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
b050: 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
b060: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
b070: 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
b080: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
b090: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
b0a0: 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
b0b0: 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
b0c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
b0d0: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
b0e0: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
b0f0: 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
b100: 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
b110: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
b120: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
b130: 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
b140: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
b150: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
b160: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
b170: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
b180: 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
b190: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
b1a0: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
b1b0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
b1c0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
b1d0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
b1e0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
b1f0: 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
b200: 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
b210: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
b220: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
b230: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
b240: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
b250: 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
b260: 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
b270: 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
b280: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
b290: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
b2a0: 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
b2b0: 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  6)  N bytes of t
b2c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b2d0: 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
b2e0: 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
b2f0: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
b300: 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
b310: 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
b320: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
b330: 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
b340: 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
b350: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
b360: 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
b370: 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
b380: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
b390: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
b3a0: 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
b3b0: 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
b3c0: 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (7)  Zero or mor
b3d0: 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
b3e0: 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
b3f0: 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
b400: 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
b410: 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
b420: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
b430: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
b440: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
b450: 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
b460: 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
b470: 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
b480: 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
b490: 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74  n the first 6 it
b4a0: 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
b4b0: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
b4c0: 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
b4d0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74  stance of the 7t
b4e0: 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
b4f0: 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
b500: 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
b510: 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
b520: 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
b530: 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
b540: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
b550: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
b560: 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
b570: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
b580: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
b590: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
b5a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
b5b0: 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
b5c0: 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
b5d0: 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
b5e0: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
b5f0: 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
b600: 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
b610: 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
b620: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b630: 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
b640: 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
b650: 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
b660: 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
b670: 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
b680: 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
b690: 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
b6a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
b6b0: 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
b6c0: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
b6d0: 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
b6e0: 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
b6f0: 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
b700: 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
b710: 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
b720: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
b730: 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
b740: 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
b750: 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
b760: 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
b770: 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
b780: 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
b790: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
b7a0: 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
b7b0: 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
b7c0: 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
b7d0: 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
b7e0: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
b7f0: 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
b800: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
b810: 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
b820: 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
b830: 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
b840: 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
b850: 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
b860: 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
b870: 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
b880: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
b890: 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
b8a0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
b8b0: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
b8c0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
b8d0: 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
b8e0: 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
b8f0: 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
b900: 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
b910: 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
b920: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
b930: 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
b940: 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
b950: 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
b960: 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
b970: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
b980: 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
b990: 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
b9a0: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
b9b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
b9c0: 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
b9d0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
b9e0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
b9f0: 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
ba00: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
ba10: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
ba20: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
ba30: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
ba40: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
ba50: 6f 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  ot){.  i64 szJ; 
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba70: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
ba80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
ba90: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
baa0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
bab0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bac0: 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
bad0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
bae0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
baf0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
bb00: 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
bb10: 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
bb20: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
bb30: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
bb40: 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
bb50: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
bb60: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
bb70: 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
bb80: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
bb90: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
bba0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
bbb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
bbc0: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
bbd0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
bbe0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
bbf0: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
bc00: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
bc10: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
bc20: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
bc30: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
bc40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
bc50: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
bc60: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
bc70: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
bc80: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
bc90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
bca0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
bcb0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
bcc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
bcd0: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
bce0: 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
bcf0: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
bd00: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
bd10: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
bd20: 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
bd30: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
bd40: 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
bd50: 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
bd60: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
bd70: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
bd80: 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
bd90: 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
bda0: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
bdb0: 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
bdc0: 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b  >jfd, &zMaster);
bdd0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
bde0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
bdf0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
be00: 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26  K || (zMaster &&
be10: 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45   !sqlite3OsFileE
be20: 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20  xists(zMaster)) 
be30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
be40: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
be50: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
be60: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
be70: 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
be80: 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
be90: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
bea0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  }.  sqlite3OsSee
beb0: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  k(pPager->jfd, 0
bec0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
bed0: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  rnalOff = 0;..  
bee0: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
bef0: 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
bf00: 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72  hen the readJour
bf10: 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65  nalHdr() call re
bf20: 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54  turns.  ** SQLIT
bf30: 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
bf40: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
bf50: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a  .  while( 1 ){..
bf60: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
bf70: 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
bf80: 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
bf90: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
bfa0: 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
bfb0: 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
bfc0: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
bfd0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
bfe0: 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
bff0: 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
c000: 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
c010: 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
c020: 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  of failed while 
c030: 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
c040: 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
c050: 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
c060: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
c070: 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
c080: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
c090: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
c0a0: 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
c0b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
c0c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
c0d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c0e0: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
c0f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
c100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c110: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c120: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
c130: 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
c140: 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
c150: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
c160: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
c170: 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
c180: 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
c190: 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
c1a0: 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
c1b0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
c1c0: 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
c1d0: 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
c1e0: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
c1f0: 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
c200: 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
c210: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
c220: 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
c230: 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
c240: 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
c250: 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
c260: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
c270: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
c280: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c290: 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
c2a0: 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  c = (szJ - JOURN
c2b0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
c2c0: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
c2d0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
c2e0: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
c2f0: 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
c300: 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
c310: 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
c320: 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
c330: 2a 20 70 72 6f 63 65 73 73 2e 20 49 6e 20 74 68  * process. In th
c340: 69 73 20 63 61 73 65 20 74 68 65 20 72 65 73 74  is case the rest
c350: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c360: 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
c370: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 6c  .    ** journall
c380: 65 64 20 63 6f 70 69 65 73 20 6f 66 20 70 61 67  ed copies of pag
c390: 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
c3a0: 62 65 20 72 65 61 64 20 62 61 63 6b 20 69 6e 74  be read back int
c3b0: 6f 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20  o the cache..   
c3c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
c3d0: 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 29 7b  ==0 && !isHot ){
c3e0: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
c3f0: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
c400: 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
c410: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
c420: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c430: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
c440: 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
c450: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
c460: 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
c470: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
c480: 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27  file back to it'
c490: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
c4a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c4b0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
c4c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
c4d0: 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
c4e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
c4f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
c500: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61  ager) ){.      a
c510: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
c520: 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20  rigDbSize==0 || 
c530: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
c540: 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20  ze==mxPg );.    
c550: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
c560: 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
c570: 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
c580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c590: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
c5a0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
c5b0: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
c5c0: 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
c5d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
c5e0: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
c5f0: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
c600: 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
c610: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
c620: 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
c630: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63   for(i=0; i<nRec
c640: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
c650: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
c660: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
c670: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
c680: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
c690: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c6a0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
c6b0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
c6c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c6d0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
c6e0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c6f0: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
c700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c710: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c720: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c730: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
c740: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c750: 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
c760: 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
c770: 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
c780: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
c790: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
c7a0: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
c7b0: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
c7c0: 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72   }.  if( zMaster
c7d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
c7e0: 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
c7f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
c800: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
c810: 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20  eturn true,.    
c820: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
c830: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
c840: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c850: 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
c860: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c870: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
c880: 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
c890: 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  r(zMaster);.    
c8a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
c8b0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a  (zMaster);.  }..
c8c0: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
c8d0: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
c8e0: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
c8f0: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
c900: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
c910: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
c920: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
c930: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
c940: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
c950: 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ZE.  ** value. R
c960: 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
c970: 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
c980: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
c990: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   */.  pPager->se
c9a0: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
c9b0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
c9c0: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 72 65  Pager->fd);.  re
c9d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c9e0: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
c9f0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
ca00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
ca10: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
ca20: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
ca30: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
ca40: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
ca50: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
ca60: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
ca70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
ca80: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
ca90: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
caa0: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
cab0: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
cac0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
cad0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
cae0: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
caf0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
cb00: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
cb10: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
cb20: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
cb30: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
cb40: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
cb50: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
cb60: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
cb70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
cb80: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
cb90: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
cba0: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
cbb0: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
cbc0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
cbd0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
cbe0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
cbf0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
cc00: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cc10: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
cc20: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72  nal */.  i64 hdr
cc30: 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b  Off;.  int nRec;
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
cc60: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
cc90: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
cca0: 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
ccb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66  >journalOff;.#if
ccc0: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b  ndef NDEBUG .  {
ccd0: 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b  .    i64 os_szJ;
cce0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ccf0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
cd00: 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a  er->jfd, &os_szJ
cd10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
cd20: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
cd30: 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  n rc;.    assert
cd40: 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b  ( szJ==os_szJ );
cd50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
cd60: 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20  * Set hdrOff to 
cd70: 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75  be the offset ju
cd80: 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  st after the end
cd90: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75   of the last jou
cda0: 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77  rnal.  ** page w
cdb0: 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68  ritten before th
cdc0: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  e first journal-
cdd0: 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20  header for this 
cde0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
cdf0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77  ransaction was w
ce00: 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65  ritten, or the e
ce10: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
ce20: 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  f no journal.  *
ce30: 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  * header was wri
ce40: 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  tten..  */.  hdr
ce50: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
ce60: 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65  mtHdrOff;.  asse
ce70: 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
ce80: 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20  Sync || !hdrOff 
ce90: 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66  );.  if( !hdrOff
cea0: 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d   ){.    hdrOff =
ceb0: 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   szJ;.  }.  .  /
cec0: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
ced0: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
cee0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
cef0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
cf00: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
cf10: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
cf20: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
cf30: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
cf40: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
cf50: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
cf60: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
cf70: 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
cf80: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
cf90: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
cfa0: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ize;..  /* Figur
cfb0: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
cfc0: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
cfd0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
cfe0: 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
cff0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
d000: 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d  InUse && pPager-
d010: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
d020: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
d030: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
d040: 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65  ;.  nRec = pPage
d050: 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a  r->stmtNRec;.  .
d060: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
d070: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
d080: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d090: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
d0a0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
d0b0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
d0c0: 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
d0d0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69  ment journal omi
d0e0: 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f  ts checksums fro
d0f0: 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f  m.  ** each reco
d100: 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66  rd since power-f
d110: 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20  ailure recovery 
d120: 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  is not important
d130: 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20   to statement.  
d140: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ** journals..  *
d150: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
d160: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
d170: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
d180: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
d190: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
d1a0: 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  tfd, 0);.    ass
d1b0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
d1c0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
d1d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d1e0: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
d1f0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
d200: 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20  * Now roll some 
d210: 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  pages back from 
d220: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
d230: 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73  journal. Pager.s
d240: 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61  tmtJSize.  ** wa
d250: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
d260: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
d270: 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  hen this stateme
d280: 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  nt was started, 
d290: 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69  so.  ** everythi
d2a0: 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65  ng after that ne
d2b0: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
d2c0: 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e   back, either in
d2d0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
d2e0: 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79  base, the memory
d2f0: 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e   cache, or both.
d300: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74  .  **.  ** If it
d310: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
d320: 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72  en Pager.stmtHdr
d330: 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65  Off is the offse
d340: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
d350: 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
d360: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
d370: 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74  written during t
d380: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
d390: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
d3a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d3b0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
d3c0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  , pPager->stmtJS
d3d0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
d3e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d3f0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d400: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
d410: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d420: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
d430: 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
d440: 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
d450: 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
d460: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
d470: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64  >journalOff < hd
d480: 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  rOff ){.    rc =
d490: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d4a0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d4b0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
d4c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
d4d0: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
d4e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d4f0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
d500: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
d510: 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70  .  }..  while( p
d520: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d530: 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75  f < szJ ){.    u
d540: 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20  32 nJRec;       
d550: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
d560: 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
d570: 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
d580: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
d590: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
d5a0: 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
d5b0: 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72  ummy);.    if( r
d5c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d5d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
d5e0: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
d5f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
d600: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
d610: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52     }.    if( nJR
d620: 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ec==0 ){.      n
d630: 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  JRec = (szJ - pP
d640: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d650: 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67  ) / (pPager->pag
d660: 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a  eSize+8);.    }.
d670: 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d      for(i=nJRec-
d680: 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65  1; i>=0 && pPage
d690: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
d6a0: 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  szJ; i--){.     
d6b0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
d6c0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
d6d0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
d6e0: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  d, 1);.      ass
d6f0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
d700: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66  DONE );.      if
d710: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d720: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
d730: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
d740: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
d750: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
d760: 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  .  .end_stmt_pla
d770: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
d780: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20  =SQLITE_OK) {.  
d790: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
d7a0: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
d7b0: 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  /* pager_reload_
d7c0: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a  cache(pPager); *
d7d0: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
d7e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
d7f0: 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
d800: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
d810: 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
d820: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
d830: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
d840: 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
d850: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
d860: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
d870: 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
d880: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
d890: 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  mxPage;.  }else{
d8a0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
d8b0: 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  age = 10;.  }.}.
d8c0: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
d8d0: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
d8e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
d8f0: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
d900: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
d910: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
d920: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
d930: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
d940: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
d950: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
d960: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
d970: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
d980: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
d990: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
d9a0: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
d9b0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
d9c0: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
d9d0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
d9e0: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
d9f0: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
da00: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
da10: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
da20: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
da30: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
da40: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
da50: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
da60: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
da70: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
da80: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
da90: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
daa0: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
dab0: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
dac0: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
dae0: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
daf0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
db00: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
db10: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
db20: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
db30: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
db40: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
db50: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
db60: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
db70: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
db80: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
db90: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
dba0: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
dbb0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
dbc0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
dbe0: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
dbf0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
dc00: 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
dc10: 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
dc20: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
dc30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
dc40: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
dc50: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
dc60: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
dc70: 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
dc80: 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
dc90: 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
dca0: 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
dcb0: 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
dcc0: 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
dcd0: 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
dcf0: 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
dd00: 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
dd10: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
dd20: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
dd30: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
dd40: 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
dd50: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
dd60: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
dd70: 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
dd80: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
dd90: 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
dda0: 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
ddb0: 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
ddc0: 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
ddd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
dde0: 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
ddf0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
de00: 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
de10: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
de20: 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  el, int full_fsy
de30: 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
de40: 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
de50: 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
de60: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
de70: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
de80: 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
de90: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
dea0: 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 20  ger->full_fsync 
deb0: 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20  = full_fsync;.  
dec0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
ded0: 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
dee0: 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
def0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
df00: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
df10: 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
df20: 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
df30: 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
df40: 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
df50: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
df60: 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
df70: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
df80: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
df90: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
dfa0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
dfb0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
dfc0: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
dfd0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
dfe0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
dff0: 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a  orary file. .**.
e000: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
e010: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
e020: 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
e030: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
e040: 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
e050: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
e060: 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  if we fail..**.*
e070: 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  * The OS will au
e080: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
e090: 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
e0a0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
e0b0: 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  .** closed..*/.s
e0c0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
e0d0: 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 4f  3PagerOpentemp(O
e0e0: 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20  sFile **pFd){.  
e0f0: 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69  int cnt = 8;.  i
e100: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 46  nt rc;.  char zF
e110: 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ile[SQLITE_TEMPN
e120: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 23 69 66 64  AME_SIZE];..#ifd
e130: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
e140: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
e150: 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
e160: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
e170: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
e180: 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 64 6f  y */.#endif.  do
e190: 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20  {.    cnt--;.   
e1a0: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
e1b0: 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20  leName(zFile);. 
e1c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e1d0: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
e1e0: 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20  File, pFd, 1);. 
e1f0: 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26   }while( cnt>0 &
e200: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc!=SQLITE_OK 
e210: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
e220: 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
e230: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
e240: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
e250: 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
e260: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
e270: 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
e280: 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
e290: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
e2a0: 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
e2b0: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
e2c0: 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
e2d0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
e2e0: 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
e2f0: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
e300: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
e310: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
e320: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
e330: 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ng sqlite3PagerU
e340: 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nref()..**.** If
e350: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
e360: 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
e370: 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
e380: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
e390: 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
e3a0: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
e3b0: 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
e3c0: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
e3d0: 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
e3e0: 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63  lly when it is c
e3f0: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
e400: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
e410: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c  emory:" then all
e420: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
e430: 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a  held in cache..*
e440: 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  * It is never wr
e450: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20  itten to disk.  
e460: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
e470: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
e480: 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  .** in-memory da
e490: 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
e4a0: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
e4b0: 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
e4c0: 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
e4d0: 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
e4e0: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
e4f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e500: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
e510: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
e520: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
e530: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
e540: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
e550: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
e560: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
e570: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
e580: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
e590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
e5a0: 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
e5b0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  this file */.){.
e5c0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
e5d0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75  = 0;.  char *zFu
e5e0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a  llPathname = 0;.
e5f0: 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20    int nameLen;  
e600: 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77  /* Compiler is w
e610: 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c  rong. This is al
e620: 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
e630: 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20   before use */. 
e640: 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20 69   OsFile *fd;.  i
e650: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e660: 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  K;.  int i;.  in
e670: 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  t tempFile = 0;.
e680: 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
e690: 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
e6a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f  = 0;.  int useJo
e6b0: 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
e6c0: 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
e6d0: 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e  NAL)==0;.  int n
e6e0: 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
e6f0: 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
e700: 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68  ADLOCK)!=0;.  ch
e710: 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
e720: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
e730: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e740: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
e750: 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61  GEMENT.  /* A ma
e760: 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61  lloc() cannot fa
e770: 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72  il in sqlite3Thr
e780: 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65  eadData() as one
e790: 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74   or more calls t
e7a0: 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29  o .  ** malloc()
e7b0: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
e7c0: 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20  dy been made by 
e7d0: 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f  this thread befo
e7e0: 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20  re it gets.  ** 
e7f0: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54  to this point. T
e800: 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68  his means the Th
e810: 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61  readData must ha
e820: 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
e830: 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73  d already.  ** s
e840: 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  o that ThreadDat
e850: 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20  a.nAlloc can be 
e860: 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62 65  set. It would be
e870: 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74 0a   nice to assert.
e880: 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61 64    ** that Thread
e890: 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e  Data.nAlloc is n
e8a0: 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61  on-zero, but ala
e8b0: 73 20 74 68 69 73 20 62 72 65 61 6b 73 20 74 65  s this breaks te
e8c0: 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20 77  st cases .  ** w
e8d0: 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65  ritten to invoke
e8e0: 20 74 68 65 20 70 61 67 65 72 20 64 69 72 65 63   the pager direc
e8f0: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65  tly..  */.  Thre
e900: 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
e910: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
e920: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ();.  assert( pT
e930: 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  sd );.#endif..  
e940: 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20 68  /* If malloc() h
e950: 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65  as already faile
e960: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
e970: 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65 76  NOMEM. Before ev
e980: 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67 20  en.  ** testing 
e990: 66 6f 72 20 74 68 69 73 2c 20 73 65 74 20 2a 70  for this, set *p
e9a0: 70 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20 73  pPager to NULL s
e9b0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e 6f  o the caller kno
e9c0: 77 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  ws the pager.  *
e9d0: 2a 20 73 74 72 75 63 74 75 72 65 20 77 61 73 20  * structure was 
e9e0: 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e  never allocated.
e9f0: 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65   .  */.  *ppPage
ea00: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  r = 0;.  if( sql
ea10: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
ea20: 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  () ){.    return
ea30: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ea40: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66 64 2c   }.  memset(&fd,
ea50: 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29 3b   0, sizeof(fd));
ea60: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
ea70: 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73  pager file and s
ea80: 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  et zFullPathname
ea90: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c   to point at mal
eaa0: 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65  loc()ed .  ** me
eab0: 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mory containing 
eac0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c  the complete fil
ead0: 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c  ename (i.e. incl
eae0: 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  uding the direct
eaf0: 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ory)..  */.  if(
eb00: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
eb10: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69  ilename[0] ){.#i
eb20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
eb30: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
eb40: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
eb50: 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
eb60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
eb70: 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75  b = 1;.      zFu
eb80: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
eb90: 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20  iteStrDup("");. 
eba0: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
ebb0: 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c      {.      zFul
ebc0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
ebd0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
ebe0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
ebf0: 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74      if( zFullPat
ec00: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
ec10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
ec20: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
ec30: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
ec40: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
ec50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
ec60: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
ec70: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
ec80: 70 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  p(&fd);.    sqli
ec90: 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
eca0: 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7a 46  e(zTemp);.    zF
ecb0: 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b  ilename = zTemp;
ecc0: 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61  .    zFullPathna
ecd0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
ece0: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
ecf0: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
ed00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ed10: 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d        tempFile =
ed20: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
ed30: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
ed40: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
ed50: 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65  . As part of the
ed60: 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e   same allocation
ed70: 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  , allocate.  ** 
ed80: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 66 75  space for the fu
ed90: 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65 20  ll paths of the 
eda0: 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79 20  file, directory 
edb0: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  and journal .  *
edc0: 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  * (Pager.zFilena
edd0: 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65 63  me, Pager.zDirec
ede0: 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e 7a  tory and Pager.z
edf0: 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20  Journal)..  */. 
ee00: 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61   if( zFullPathna
ee10: 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65  me ){.    nameLe
ee20: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c  n = strlen(zFull
ee30: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70  Pathname);.    p
ee40: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61  Pager = sqliteMa
ee50: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50  lloc( sizeof(*pP
ee60: 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a  ager) + nameLen*
ee70: 33 20 2b 20 33 30 20 29 3b 0a 20 20 20 20 69 66  3 + 30 );.    if
ee80: 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
ee90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
eea0: 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
eeb0: 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a 29 73  pace = (char *)s
eec0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 53  qliteMallocRaw(S
eed0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
eee0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  GE_SIZE);.    }.
eef0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 61 6e    }...  /* If an
ef00: 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
ef10: 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
ef20: 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
ef30: 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20  ee the memory . 
ef40: 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
ef50: 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y zFullPathname,
ef60: 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72 20   free the Pager 
ef70: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
ef80: 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  ose the .  ** fi
ef90: 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  le. Since the pa
efa0: 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63  ger is not alloc
efb0: 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f  ated there is no
efc0: 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20   need to set .  
efd0: 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72  ** any Pager.err
efe0: 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a  Mask variables..
eff0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
f000: 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68  er || !zFullPath
f010: 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67 65 72 2d  name || !pPager-
f020: 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c 20 72 63  >pTmpSpace || rc
f030: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f040: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
f050: 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  e(&fd);.    sqli
f060: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
f070: 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  name);.    sqlit
f080: 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
f090: 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d     return ((rc==
f0a0: 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54  SQLITE_OK)?SQLIT
f0b0: 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d  E_NOMEM:rc);.  }
f0c0: 0a 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e  ..  TRACE3("OPEN
f0d0: 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
f0e0: 41 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75  ANDLEID(fd), zFu
f0f0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49  llPathname);.  I
f100: 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
f110: 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
f120: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a  zFullPathname)).
f130: 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
f140: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
f150: 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
f160: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20  r->zDirectory = 
f170: 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  &pPager->zFilena
f180: 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  me[nameLen+1];. 
f190: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
f1a0: 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69  l = &pPager->zDi
f1b0: 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b  rectory[nameLen+
f1c0: 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  1];.  strcpy(pPa
f1d0: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
f1e0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f1f0: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
f200: 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75  >zDirectory, zFu
f210: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20  llPathname);..  
f220: 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69  for(i=nameLen; i
f230: 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
f240: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
f250: 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
f260: 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
f270: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
f280: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61   0;.  strcpy(pPa
f290: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
f2a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f2b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
f2c0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74  lPathname);.  st
f2d0: 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  rcpy(&pPager->zJ
f2e0: 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c  ournal[nameLen],
f2f0: 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20   "-journal");.  
f300: 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b  pPager->fd = fd;
f310: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  .  /* pPager->jo
f320: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a  urnalOpen = 0; *
f330: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  /.  pPager->useJ
f340: 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
f350: 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
f360: 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
f370: 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
f380: 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
f390: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
f3a0: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
f3b0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
f3c0: 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
f3d0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
f3e0: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
f3f0: 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
f400: 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
f410: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
f420: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
f430: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
f440: 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
f450: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
f460: 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
f470: 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
f480: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f490: 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20  ger->nMaxPage = 
f4a0: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
f4b0: 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
f4c0: 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 55 4e  assert( PAGER_UN
f4d0: 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20  LOCK==0 );.  /* 
f4e0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
f4f0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
f500: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
f510: 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
f520: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f530: 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70   = tempFile;.  p
f540: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
f550: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
f560: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
f570: 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
f580: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
f590: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
f5a0: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
f5b0: 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
f5c0: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
f5d0: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
f5e0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
f5f0: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
f600: 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
f610: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
f620: 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
f630: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
f640: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
f650: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f  ger->nExtra = FO
f660: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
f670: 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28  xtra);.  assert(
f680: 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66  fd||memDb);.  if
f690: 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  ( !memDb ){.    
f6a0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
f6b0: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
f6c0: 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20  ctorSize(fd);.  
f6d0: 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
f6e0: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
f6f0: 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
f700: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
f710: 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
f720: 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
f730: 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
f740: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f750: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
f760: 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65  NAGEMENT.  pPage
f770: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d  r->pNext = pTsd-
f780: 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d  >pPager;.  pTsd-
f790: 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
f7a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
f7b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f7c0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
f7d0: 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
f7e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
f7f0: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
f800: 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70  handler(Pager *p
f810: 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c  Pager, BusyHandl
f820: 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  er *pBusyHandler
f830: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  ){.  pPager->pBu
f840: 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73  syHandler = pBus
f850: 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a  yHandler;.}../*.
f860: 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72  ** Set the destr
f870: 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70  uctor for this p
f880: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
f890: 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74  LL, the destruct
f8a0: 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  or is called.** 
f8b0: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
f8c0: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68  ce count on each
f8d0: 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65   page reaches ze
f8e0: 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63  ro.  The destruc
f8f0: 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  tor can.** be us
f900: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69  ed to clean up i
f910: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
f920: 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20  e extra segment 
f930: 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68  appended to each
f940: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
f950: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e   destructor is n
f960: 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72  ot called as a r
f970: 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67  esult sqlite3Pag
f980: 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  erClose().  .** 
f990: 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
f9a0: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
f9b0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
f9c0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
f9d0: 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
f9e0: 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
f9f0: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
fa00: 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  c)(DbPage*,int))
fa10: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
fa20: 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
fa30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
fa40: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
fa50: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
fa60: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
fa70: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
fa80: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
fa90: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
faa0: 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
fab0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
fac0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
fad0: 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
fae0: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
faf0: 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
fb00: 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
fb10: 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
fb20: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
fb30: 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
fb40: 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
fb50: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
fb60: 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
fb70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
fb80: 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50  gerSetReiniter(P
fb90: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
fba0: 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
fbb0: 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
fbc0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
fbd0: 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
fbe0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67  *.** Set the pag
fbf0: 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e 20  e size.  Return 
fc00: 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20 49  the new size.  I
fc10: 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
fc20: 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69  w page.** size i
fc30: 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  s inappropriate,
fc40: 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
fc50: 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
fc60: 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e  s selected.** an
fc70: 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  d returned..*/.i
fc80: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
fc90: 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
fca0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61   *pPager, int pa
fcb0: 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  geSize){.  asser
fcc0: 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t( pageSize>=512
fcd0: 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
fce0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
fcf0: 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ZE );.  if( !pPa
fd00: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
fd10: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
fd20: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
fd30: 20 20 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f     sqlite3Reallo
fd40: 63 4f 72 46 72 65 65 28 28 76 6f 69 64 20 2a 2a  cOrFree((void **
fd50: 29 26 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  )&pPager->pTmpSp
fd60: 61 63 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  ace, pageSize);.
fd70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
fd80: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  ger->pageSize;.}
fd90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
fda0: 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
fdb0: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
fdc0: 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
fdd0: 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
fde0: 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
fdf0: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
fe00: 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
fe10: 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
fe20: 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
fe30: 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
fe40: 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
fe50: 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
fe60: 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
fe70: 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
fe80: 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
fe90: 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
fea0: 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
feb0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
fec0: 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
fed0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
fee0: 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
fef0: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
ff00: 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
ff10: 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
ff20: 3b 0a 76 6f 69 64 20 63 6c 65 61 72 5f 73 69 6d  ;.void clear_sim
ff30: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28  ulated_io_error(
ff40: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
ff50: 65 72 72 6f 72 5f 68 69 74 20 3d 20 30 3b 0a 7d  error_hit = 0;.}
ff60: 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
ff70: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
ff80: 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
ff90: 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
ffa0: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
ffb0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
ffc0: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
ffd0: 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
ffe0: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
fff0: 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
10000 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
10010 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
10020 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
10030 69 6e 65 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61  ine clear_simula
10040 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 0a 23  ted_io_error().#
10050 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
10060 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10070 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
10080 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
10090 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
100a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
100b0 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
100c0 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
100d0 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
100e0 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
100f0 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
10100 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65   to. .**.** No e
10110 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73  rror checking is
10120 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f   done. The ratio
10130 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20  nal for this is 
10140 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
10150 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61  on .** may be ca
10160 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  lled even if the
10170 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
10180 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20  xist or contain 
10190 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a  a header. In .**
101a0 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c   these cases sql
101b0 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c  ite3OsRead() wil
101c0 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  l return an erro
101d0 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  r, to which the 
101e0 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70  correct .** resp
101f0 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20  onse is to zero 
10200 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44  the memory at pD
10210 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  est and continue
10220 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72  .  A real IO err
10230 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73  or .** will pres
10240 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64  umably recur and
10250 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61   be picked up la
10260 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b  ter (Todo: Think
10270 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f   about this)..*/
10280 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
10290 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
102a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
102b0 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
102c0 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
102d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
102e0 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
102f0 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20  t, 0, N);.  if( 
10300 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20  MEMDB==0 ){.    
10310 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
10320 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
10330 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
10340 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b  (pPager->fd, 0);
10350 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
10360 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
10370 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
10380 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
10390 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
103a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
103b0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
103c0 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20  , pDest, N);.   
103d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
103e0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
103f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
10400 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
10410 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10430 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
10440 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
10450 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
10460 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
10470 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Pager. .**.** If
10480 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54   the PENDING_BYT
10490 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  E lies on the pa
104a0 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65  ge directly afte
104b0 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
104c0 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63  .** file, then c
104d0 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67  onsider this pag
104e0 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  e part of the fi
104f0 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d  le too. For exam
10500 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49  ple, if.** PENDI
10510 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20  NG_BYTE is byte 
10520 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20  4096 (the first 
10530 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20  byte of page 5) 
10540 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
10550 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34  the.** file is 4
10560 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20  096 bytes, 5 is 
10570 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
10580 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71   of 4..*/.int sq
10590 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
105a0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
105b0 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 69  r){.  i64 n;.  i
105c0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
105d0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
105e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
105f0 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
10600 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
10610 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
10620 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67   ){.    n = pPag
10630 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20  er->dbSize;.  } 
10640 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 28 20 28  else {.    if( (
10650 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
10660 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
10670 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f  d, &n))!=SQLITE_
10680 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
10690 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
106a0 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
106b0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
106c0 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67  f( n>0 && n<pPag
106d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
106e0 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
106f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
10700 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /= pPager->pageS
10710 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ize;.    }.    i
10720 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
10730 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
10740 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
10750 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  dbSize = n;.    
10760 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28  }.  }.  if( n==(
10770 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
10780 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
10790 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  {.    n++;.  }. 
107a0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23   return n;.}...#
107b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
107c0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
107d0 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
107e0 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
107f0 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
10800 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
10810 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
10820 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  eFree(pHist->pOr
10830 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ig);.  sqliteFre
10840 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
10850 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
10860 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
10870 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
10880 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
10890 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
108a0 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
108b0 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
108c0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
108d0 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f  rnal(Pager*);../
108e0 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
108f0 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
10900 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74  hain. Also set t
10910 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
10920 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  o 0 to indicate.
10930 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
10940 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
10950 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
10960 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
10970 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
10980 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
10990 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63  page() routine c
109a0 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20  an leave a page 
109b0 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74  in the .** pNext
109c0 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c  Free/pPrevFree l
109d0 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ist that is not 
109e0 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  a part of any ha
109f0 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  sh-chain..*/.sta
10a00 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48  tic void unlinkH
10a10 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a  ashChain(Pager *
10a20 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
10a30 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
10a40 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pgno==0 ){.    a
10a50 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
10a60 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d  tHash==0 && pPg-
10a70 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
10a80 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10a90 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
10aa0 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  tHash ){.    pPg
10ab0 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
10ac0 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
10ad0 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  revHash;.  }.  i
10ae0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
10af0 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
10b00 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
10b10 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
10b20 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70  er->nHash-1)]!=p
10b30 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
10b40 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
10b50 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
10b60 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
10b70 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e     int h = pPg->
10b80 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
10b90 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50  nHash-1);.    pP
10ba0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
10bb0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
10bc0 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
10bd0 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73   ){.    clearHis
10be0 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49  tory(PGHDR_TO_HI
10bf0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29  ST(pPg, pPager))
10c00 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e  ;.  }.  pPg->pgn
10c10 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e  o = 0;.  pPg->pN
10c20 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
10c30 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a  PrevHash = 0;.}.
10c40 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
10c50 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
10c60 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
10c70 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
10c80 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
10c90 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
10ca0 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
10cb0 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
10cc0 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
10cd0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
10ce0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
10cf0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
10d00 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
10d10 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
10d20 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
10d30 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
10d40 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
10d50 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
10d60 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
10d70 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
10d80 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
10d90 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
10da0 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
10db0 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
10dc0 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
10dd0 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
10de0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
10df0 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
10e00 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
10e10 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
10e20 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
10e30 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
10e40 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
10e50 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
10e60 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
10e70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
10e80 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
10e90 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
10ea0 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
10eb0 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
10ec0 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
10ed0 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
10ee0 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
10ef0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10f00 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
10f10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
10f20 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
10f30 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
10f40 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
10f50 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
10f60 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
10f70 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
10f80 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69   table */.  unli
10f90 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
10fa0 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66  er, pPg);.}..#if
10fb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10fc0 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
10fd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10fe0 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65  used to truncate
10ff0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
11000 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a  tabase.  Delete.
11010 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f  ** all pages who
11020 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65  se pgno is large
11030 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
11040 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72  bSize and is unr
11050 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65  eferenced..** Re
11060 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c  ferenced pages l
11070 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
11080 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65  r->dbSize are ze
11090 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  roed..*/.static 
110a0 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63  void memoryTrunc
110b0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
110c0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
110d0 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67  ;.  PgHdr **ppPg
110e0 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d  ;.  int dbSize =
110f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
11100 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67  ..  ppPg = &pPag
11110 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c  er->pAll;.  whil
11120 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29  e( (pPg = *ppPg)
11130 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
11140 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65  Pg->pgno<=dbSize
11150 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d   ){.      ppPg =
11160 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
11170 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
11180 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20  Pg->nRef>0 ){.  
11190 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
111a0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
111b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
111c0 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20  ze);.      ppPg 
111d0 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
111e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
111f0 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e     *ppPg = pPg->
11200 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
11210 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
11220 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
11230 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pPg);.      sql
11240 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
11250 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
11260 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  e--;.    }.  }.}
11270 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 6d  .#else.#define m
11280 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 29  emoryTruncate(p)
11290 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
112a0 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
112b0 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20  ock on a file.  
112c0 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
112d0 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
112e0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65  lock.** is curre
112f0 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
11300 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69  le.  Repeat unti
11310 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
11320 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66  ack returns.** f
11330 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
11340 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
11350 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
11360 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
11370 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
11380 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
11390 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
113a0 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
113b0 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
113c0 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
113d0 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
113e0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pe){.  int rc;..
113f0 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
11400 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
11410 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
11420 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
11430 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
11440 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
11450 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
11460 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
11470 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
11480 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
11490 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
114a0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
114b0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
114c0 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
114d0 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
114e0 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
114f0 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61  e unknown */.  a
11500 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
11510 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
11520 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  ED || pPager->db
11530 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20  Size<0 || MEMDB 
11540 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
11550 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
11560 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  e ){.    rc = SQ
11570 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
11580 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
11590 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
115a0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
115b0 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d  locktype);.    }
115c0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
115d0 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65  E_BUSY && sqlite
115e0 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
115f0 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
11600 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20  Handler) );.    
11610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11620 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
11630 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74  r->state = lockt
11640 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ype;.      IOTRA
11650 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
11660 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b  n", pPager, lock
11670 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d  type)).    }.  }
11680 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11690 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
116a0 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  the file to the 
116b0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
116c0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e  specified..*/.in
116d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
116e0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
116f0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
11700 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
11710 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
11720 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
11730 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20  ED || MEMDB );. 
11740 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
11750 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
11760 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
11770 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  rCode ){.    rc 
11780 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
11790 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  e;.    return rc
117a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
117b0 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61  e>=(unsigned)pPa
117c0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
117d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
117e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  _OK;.  }.  if( M
117f0 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
11800 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
11810 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72  ge;.    memoryTr
11820 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
11830 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11840 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
11850 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
11860 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
11870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11880 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11890 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63  .  /* Get an exc
118a0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
118b0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
118c0 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a  re truncating. *
118d0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
118e0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
118f0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
11900 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
11910 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11920 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
11930 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
11940 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50  ncate(pPager, nP
11950 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
11960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11970 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
11980 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72  = nPage;.  }.  r
11990 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
119a0 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
119b0 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
119c0 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
119d0 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
119e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
119f0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
11a00 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
11a10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
11a20 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
11a30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
11a40 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
11a50 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
11a60 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
11a70 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
11a80 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
11a90 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
11aa0 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
11ab0 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
11ac0 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
11ad0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
11ae0 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
11af0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
11b00 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
11b10 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11b20 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
11b30 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
11b40 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
11b50 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
11b60 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
11b70 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
11b80 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
11b90 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
11ba0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
11bb0 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
11bc0 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
11bd0 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
11be0 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
11bf0 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
11c00 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
11c10 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11c20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11c30 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
11c40 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61  GEMENT.  /* A ma
11c50 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61  lloc() cannot fa
11c60 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72  il in sqlite3Thr
11c70 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65  eadData() as one
11c80 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74   or more calls t
11c90 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29  o .  ** malloc()
11ca0 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
11cb0 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20  dy been made by 
11cc0 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f  this thread befo
11cd0 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20  re it gets.  ** 
11ce0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54  to this point. T
11cf0 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68  his means the Th
11d00 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61  readData must ha
11d10 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
11d20 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73  d already.  ** s
11d30 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  o that ThreadDat
11d40 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20  a.nAlloc can be 
11d50 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65  set..  */.  Thre
11d60 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
11d70 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
11d80 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ();.  assert( pP
11d90 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
11da0 28 20 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e  ( pTsd && pTsd->
11db0 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66  nAlloc );.#endif
11dc0 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
11dd0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
11de0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
11df0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
11e00 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11e10 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
11e20 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
11e30 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
11e40 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
11e50 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
11e60 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
11e70 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20    TRACE2("CLOSE 
11e80 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
11e90 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41  Pager));.  IOTRA
11ea0 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
11eb0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73 73  , pPager)).  ass
11ec0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
11ed0 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d  Code || (pPager-
11ee0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
11ef0 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  && pPager->stmtO
11f00 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  pen==0) );.  if(
11f10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11f20 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
11f30 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
11f40 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
11f50 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
11f60 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
11f70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
11f80 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  mtOpen ){.    sq
11f90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
11fa0 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d  ager->stfd);.  }
11fb0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
11fc0 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  e(&pPager->fd);.
11fd0 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
11fe0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
11ff0 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
12000 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
12010 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
12020 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f  .  **   sqlite3O
12030 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
12040 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a  zFilename);.  **
12050 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20   }.  */..#ifdef 
12060 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
12070 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
12080 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
12090 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c  pager from the l
120a0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
120b0 67 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  gers starting at
120c0 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74   .  ** ThreadDat
120d0 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f  a.pPager if memo
120e0 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
120f0 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20   enabled..  */. 
12100 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73   if( pPager==pTs
12110 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  d->pPager ){.   
12120 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20   pTsd->pPager = 
12130 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
12140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65   }else{.    Page
12150 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72  r *pTmp;.    for
12160 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50  (pTmp = pTsd->pP
12170 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  ager; pTmp->pNex
12180 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d  t!=pPager; pTmp=
12190 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  pTmp->pNext){}. 
121a0 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d     pTmp->pNext =
121b0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
121c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
121d0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
121e0 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65  aHash);.  sqlite
121f0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
12200 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74  pSpace);.  sqlit
12210 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
12220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12230 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
12240 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
12250 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
12260 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
12270 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
12280 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
12290 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
122a0 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pgno;.}../*.*
122b0 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
122c0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
122d0 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
122e0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
122f0 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
12300 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
12310 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
12320 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
12330 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
12340 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
12350 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
12360 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
12370 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
12380 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
12390 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
123a0 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
123b0 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
123c0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
123d0 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
123e0 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
123f0 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
12400 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
12410 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
12420 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
12430 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
12440 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
12450 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
12460 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
12470 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
12480 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
12490 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
124a0 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
124b0 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50  .    if( pPg==pP
124c0 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
124d0 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20  tSynced ){.     
124e0 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
124f0 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
12500 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
12510 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
12520 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
12530 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
12540 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
12550 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
12560 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
12570 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
12580 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
12590 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
125a0 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  xtFree;.    }els
125b0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
125c0 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
125d0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
125e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
125f0 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
12600 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
12610 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
12620 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
12630 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12640 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
12650 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
12660 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  vFree;.    }.   
12670 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
12680 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
12690 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
126a0 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65  FO(pPg);.}.#ifde
126b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
126c0 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
126d0 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
126e0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
126f0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
12700 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b   _page_ref(pPg);
12710 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12720 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
12730 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67       REFINFO(pPg
12740 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
12750 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
12760 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
12770 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
12780 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
12790 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
127a0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
127b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
127c0 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
127d0 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
127e0 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
127f0 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
12800 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
12810 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
12820 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61  Page *pPg){.  pa
12830 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
12840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
12860 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
12870 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
12880 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
12890 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
128a0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
128b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
128c0 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
128d0 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
128e0 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
128f0 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
12900 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
12910 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
12920 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
12930 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
12940 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
12950 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
12960 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
12970 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
12980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12990 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
129a0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
129b0 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
129c0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
129d0 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
129e0 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
129f0 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
12a00 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
12a10 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
12a20 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
12a30 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
12a40 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
12a50 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
12a60 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
12a70 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
12a80 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
12a90 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
12aa0 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
12ab0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
12ac0 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
12ad0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
12ae0 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
12af0 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
12b00 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
12b10 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
12b20 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
12b30 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
12b40 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
12b50 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
12b60 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
12b70 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
12b80 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
12b90 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
12ba0 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
12bb0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
12bc0 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
12bd0 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79  r failure, so sy
12be0 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
12bf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
12c00 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
12c10 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
12c20 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
12c30 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
12c40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12c50 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
12c60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
12c70 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
12c80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
12c90 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
12ca0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64  urnal before mod
12cb0 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20  ifying the main 
12cc0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61  database.  ** (a
12cd0 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73  ssuming there is
12ce0 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69   a journal and i
12cf0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  t needs to be sy
12d00 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  nced.).  */.  if
12d10 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
12d20 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  nc ){.    if( !p
12d30 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
12d40 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12d50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12d60 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  Open );.      /*
12d70 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
12d80 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e  ->noSync ); // n
12d90 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73  oSync might be s
12da0 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  et if synchronou
12db0 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74  s.      ** was t
12dc0 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20  urned off after 
12dd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12de0 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69  was started.  Ti
12df0 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66  cket #615 */.#if
12e00 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
12e10 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    {.        /* M
12e20 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61  ake sure the pPa
12e30 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65  ger->nRec counte
12e40 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67  r we are keeping
12e50 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20   agrees.        
12e60 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  ** with the nRec
12e70 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
12e80 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
12e90 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
12ea0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
12eb0 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20  i64 jSz;.       
12ec0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12ed0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
12ee0 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20  jfd, &jSz);.    
12ef0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
12f00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12f10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12f20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
12f30 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Sz );.      }.#e
12f40 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
12f50 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
12f60 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
12f70 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
12f80 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
12f90 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
12fa0 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
12fb0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
12fc0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
12fd0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
12fe0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
12ff0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
13000 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
13010 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
13020 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
13030 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
13040 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
13050 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  k. .        */. 
13060 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
13070 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
13080 20 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28           TRACE2(
13090 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
130a0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
130b0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
130c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
130d0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
130e0 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
130f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
13100 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
13110 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
13120 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
13130 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13140 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13150 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
13160 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  jfd,.           
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13180 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
13190 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
131a0 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
131b0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
131c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
131d0 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
131e0 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
131f0 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20  Pager,.         
13200 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
13210 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
13220 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
13230 69 63 29 2c 20 34 29 29 0a 20 20 20 20 20 20 20  ic), 4)).       
13240 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
13250 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
13260 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20  Pager->nRec);.  
13270 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
13280 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
13290 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
132a0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
132b0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
132c0 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20  alOff);.        
132d0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
132e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
132f0 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a    TRACE2("SYNC j
13300 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
13310 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
13320 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
13330 28 28 22 4a 53 59 4e 43 20 25 64 5c 6e 22 2c 20  (("JSYNC %d\n", 
13340 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 72  pPager)).      r
13350 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
13360 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
13370 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
13380 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
13390 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
133a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
133b0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
133c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
133d0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
133e0 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65  0;..    /* Erase
133f0 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c   the needSync fl
13400 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61  ag from every pa
13410 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ge..    */.    f
13420 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
13430 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
13440 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
13450 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
13460 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
13470 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
13480 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
13490 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66  pFirst;.  }..#if
134a0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
134b0 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
134c0 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63  edSync flag is c
134d0 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67  lear then the Pg
134e0 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a  Hdr.needSync.  *
134f0 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f  * flag must also
13500 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c   be clear for al
13510 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79  l pages.  Verify
13520 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
13530 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75  invariant is tru
13540 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
13550 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
13560 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
13570 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
13580 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13590 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
135a0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  0 );.    }.    a
135b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
135c0 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61  FirstSynced==pPa
135d0 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20  ger->pFirst );. 
135e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
135f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13600 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73   Merge two lists
13610 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65 63   of pages connec
13620 74 65 64 20 62 79 20 70 44 69 72 74 79 20 61 6e  ted by pDirty an
13630 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e  d in pgno order.
13640 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20  .** Do not both 
13650 66 69 78 69 6e 67 20 74 68 65 20 70 50 72 65 76  fixing the pPrev
13660 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a  Dirty pointers..
13670 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
13680 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28  *merge_pagelist(
13690 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72  PgHdr *pA, PgHdr
136a0 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20 72   *pB){.  PgHdr r
136b0 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20  esult, *pTail;. 
136c0 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74   pTail = &result
136d0 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 26  ;.  while( pA &&
136e0 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70   pB ){.    if( p
136f0 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f  A->pgno<pB->pgno
13700 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d   ){.      pTail-
13710 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
13720 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a      pTail = pA;.
13730 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 70        pA = pA->p
13740 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65  Dirty;.    }else
13750 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70  {.      pTail->p
13760 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20 20  Dirty = pB;.    
13770 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20    pTail = pB;.  
13780 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44 69      pB = pB->pDi
13790 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rty;.    }.  }. 
137a0 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20 70   if( pA ){.    p
137b0 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
137c0 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  A;.  }else if( p
137d0 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  B ){.    pTail->
137e0 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d  pDirty = pB;.  }
137f0 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d  else{.    pTail-
13800 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d  >pDirty = 0;.  }
13810 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74  .  return result
13820 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  .pDirty;.}../*.*
13830 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20  * Sort the list 
13840 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  of pages in acce
13850 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
13860 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65 0a  gno.  Pages are.
13870 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ** connected by 
13880 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e  pDirty pointers.
13890 20 20 54 68 65 20 70 50 72 65 76 44 69 72 74 79    The pPrevDirty
138a0 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a   pointers are.**
138b0 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 74 68   corrupted by th
138c0 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66  is sort..*/.#def
138d0 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
138e0 54 20 32 35 0a 73 74 61 74 69 63 20 50 67 48 64  T 25.static PgHd
138f0 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73 74  r *sort_pagelist
13900 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20  (PgHdr *pIn){.  
13910 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f  PgHdr *a[N_SORT_
13920 42 55 43 4b 45 54 5d 2c 20 2a 70 3b 0a 20 20 69  BUCKET], *p;.  i
13930 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61  nt i;.  memset(a
13940 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b  , 0, sizeof(a));
13950 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b  .  while( pIn ){
13960 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20  .    p = pIn;.  
13970 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74    pIn = p->pDirt
13980 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
13990 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
139a0 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  0; i<N_SORT_BUCK
139b0 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ET-1; i++){.    
139c0 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b    if( a[i]==0 ){
139d0 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
139e0 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
139f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13a00 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65         p = merge
13a10 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
13a20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d  p);.        a[i]
13a30 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
13a40 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e    }.    if( i==N
13a50 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29  _SORT_BUCKET-1 )
13a60 7b 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d  {.      a[i] = m
13a70 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
13a80 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  i], p);.    }.  
13a90 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20  }.  p = a[0];.  
13aa0 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52  for(i=1; i<N_SOR
13ab0 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a  T_BUCKET; i++){.
13ac0 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61      p = merge_pa
13ad0 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b  gelist(p, a[i]);
13ae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
13af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
13b00 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  a list of pages 
13b10 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68  (connected by th
13b20 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
13b30 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a  ointer) write.**
13b40 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68   every one of th
13b50 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f  ose pages out to
13b60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13b70 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d  le and mark them
13b80 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e   all.** as clean
13b90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13ba0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
13bb0 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
13bc0 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
13bd0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
13be0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13c00 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
13c10 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
13c20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
13c30 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
13c40 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
13c50 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
13c60 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
13c70 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
13c80 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
13c90 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
13ca0 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
13cb0 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  g.  ** calls to 
13cc0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
13cd0 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a  are no-ops..  **
13ce0 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
13cf0 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
13d00 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
13d10 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
13d20 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
13d30 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
13d40 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
13d50 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
13d60 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
13d70 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
13d80 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
13d90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
13da0 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
13db0 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
13dc0 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
13dd0 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
13de0 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
13df0 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
13e00 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
13e10 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
13e20 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
13e30 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
13e40 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
13e50 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
13e60 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
13e70 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
13e80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
13e90 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
13ea0 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
13eb0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
13ec0 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
13ed0 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
13ee0 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
13ef0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
13f00 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
13f10 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
13f20 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
13f30 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
13f40 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
13f50 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
13f60 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
13f70 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
13f80 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
13f90 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
13fa0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
13fb0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
13fc0 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
13fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
13fe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
13ff0 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61   pList = sort_pa
14000 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20  gelist(pList);. 
14010 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
14020 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
14030 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  st->dirty );.   
14040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
14050 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
14060 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
14070 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
14080 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
14090 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
140a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
140b0 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
140c0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
140d0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
140e0 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
140f0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
14100 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
14110 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
14120 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
14130 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
14140 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
14150 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
14160 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
14170 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
14180 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
14190 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
141a0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
141b0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
141c0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
141d0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
141e0 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50  Data = CODEC2(pP
141f0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
14200 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
14210 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20  t->pgno, 6);.   
14220 20 20 20 54 52 41 43 45 33 28 22 53 54 4f 52 45     TRACE3("STORE
14230 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
14240 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
14250 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
14260 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
14270 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
14280 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
14290 6e 6f 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20  no)).      rc = 
142a0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
142b0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
142c0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
142d0 7a 65 29 3b 0a 20 20 20 20 20 20 54 45 53 54 5f  ze);.      TEST_
142e0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
142f0 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  ite);.    }.#ifn
14300 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65  def NDEBUG.    e
14310 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45  lse{.      TRACE
14320 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
14330 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
14340 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
14350 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
14360 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
14370 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14380 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
14390 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
143a0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
143b0 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
143c0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
143d0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
143e0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
143f0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
14400 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14410 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
14420 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
14430 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
14440 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
14450 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
14460 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
14470 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
14480 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
14490 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
144a0 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
144b0 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
144c0 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
144d0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
144e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
144f0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
14500 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  ->pDirty;.}../*.
14510 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
14520 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
14530 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
14540 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
14550 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
14560 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
14570 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
14580 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14590 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
145a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
145b0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
145c0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
145d0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
145e0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
145f0 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
14600 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
14610 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
14620 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
14630 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
14640 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
14650 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
14660 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
14670 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
14680 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
14690 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
146a0 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
146b0 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
146c0 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nal) ) return 0;
146d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
146e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
146f0 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  k(pPager->fd) ) 
14700 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
14710 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
14720 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30  count(pPager)==0
14730 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
14740 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
14750 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72  zJournal);.    r
14760 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
14770 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
14780 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
14790 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
147a0 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
147b0 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
147c0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d. .**.** This r
147d0 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72  outine may retur
147e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  n SQLITE_IOERR, 
147f0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53  SQLITE_FULL or S
14800 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a  QLITE_OK. It .**
14810 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68   does not set th
14820 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  e pPager->errCod
14830 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
14840 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
14850 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70  recycle(Pager *p
14860 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f  Pager, int syncO
14870 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29  k, PgHdr **ppPg)
14880 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
14890 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20    *ppPg = 0;..  
148a0 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
148b0 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
148c0 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
148d0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
148e0 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74   ** require us t
148f0 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  o do an fsync() 
14900 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  on the journal..
14910 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61    */.  pPg = pPa
14920 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
14930 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  d;..  /* If we c
14940 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
14950 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
14960 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
14970 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68  ync().  ** on th
14980 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
14990 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
149a0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
149b0 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79  s is a.  ** very
149c0 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
149d0 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
149e0 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
149f0 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a  ut sometimes.  *
14a00 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
14a10 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lped..  */.  if(
14a20 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65   pPg==0 && pPage
14a30 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e  r->pFirst && syn
14a40 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a  cOk && !MEMDB){.
14a50 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
14a60 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
14a70 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
14a80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14a90 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
14aa0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
14ab0 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  nc ){.      /* I
14ac0 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
14ad0 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
14ae0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
14af0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
14b00 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
14b10 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
14b20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
14b30 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  ying a journal. 
14b40 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74       ** header t
14b50 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
14b60 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
14b70 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
14b80 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ve.      ** alre
14b90 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
14ba0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
14bb0 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
14bc0 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ader is.      **
14bd0 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
14be0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
14bf0 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
14c00 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
14c10 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
14c20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14c30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
14c40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14c50 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
14c60 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  nc==0 );.      r
14c70 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
14c80 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
14c90 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
14ca0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
14cb0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
14cc0 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65  .    pPg = pPage
14cd0 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20  r->pFirst;.  }. 
14ce0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
14cf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14d00 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
14d10 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
14d20 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
14d30 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
14d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
14d50 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
14d60 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  */.  if( pPg->di
14d70 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rty ){.    int r
14d80 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
14d90 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
14da0 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
14db0 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
14dc0 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
14dd0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
14de0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
14df0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
14e00 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Pg );.    if( rc
14e10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14e20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14e30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
14e40 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
14e50 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
14e60 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
14e70 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
14e80 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
14e90 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73  ack, then.  ** s
14ea0 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
14eb0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
14ec0 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
14ed0 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  g the.  ** sqlit
14ee0 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e_dont_rollback(
14ef0 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  ) optimization f
14f00 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  or the rest of t
14f10 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
14f20 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65  .  ** It is nece
14f30 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73  ssary to do this
14f40 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
14f50 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  e marked alwaysR
14f60 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67  ollback.  ** mig
14f70 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61  ht be reloaded a
14f80 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62  t a later time b
14f90 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ut at that point
14fa0 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62   we won't rememb
14fb0 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  er.  ** that is 
14fc0 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  was marked alway
14fd0 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73  sRollback.  This
14fe0 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20   means that all 
14ff0 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  pages must.  ** 
15000 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  be marked as alw
15010 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  aysRollback from
15020 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20   here on out..  
15030 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  */.  if( pPg->al
15040 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
15050 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c      IOTRACE(("AL
15060 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70  WAYS_ROLLBACK %p
15070 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
15080 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
15090 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
150a0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74  }..  /* Unlink t
150b0 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d  he old page from
150c0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61   the free list a
150d0 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nd the hash tabl
150e0 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50  e.  */.  unlinkP
150f0 61 67 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54  age(pPg);.  TEST
15100 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f  _INCR(pPager->nO
15110 76 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d  vfl);..  *ppPg =
15120 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
15130 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15140 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15150 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72   is called to fr
15160 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64  ee superfluous d
15170 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
15180 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68  ated memory.** h
15190 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72  eld by the pager
151a0 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20   system. Memory 
151b0 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51  in use by any SQ
151c0 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63  Lite pager alloc
151d0 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
151e0 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61  urrent thread ma
151f0 79 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28  y be sqliteFree(
15200 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20  )ed..**.** nReq 
15210 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
15220 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
15230 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20   required. Once 
15240 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a  this much has.**
15250 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20   been released, 
15260 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
15270 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65  urns. A negative
15280 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20   value for nReq 
15290 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73  means.** free as
152a0 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
152b0 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65  possible. The re
152c0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
152d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
152e0 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
152f0 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
15300 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
15310 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
15320 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71  ANAGEMENT.int sq
15330 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73  lite3PagerReleas
15340 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  eMemory(int nReq
15350 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  ){.  const Threa
15360 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20  dData *pTsdro = 
15370 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
15380 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 50  aReadOnly();.  P
15390 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  ager *p;.  int n
153a0 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20  Released = 0;.  
153b0 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20  int i;..  /* If 
153c0 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  the the global m
153d0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68  utex is held, th
153e0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65  is subroutine be
153f0 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f  comes a.  ** o-o
15400 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66  p; zero bytes of
15410 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65   memory are free
15420 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  d.  This is beca
15430 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66  use.  ** some of
15440 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65   the code invoke
15450 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
15460 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a  on may also.  **
15470 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74   try to obtain t
15480 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74  he mutex, result
15490 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63  ing in a deadloc
154a0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  k..  */.  if( sq
154b0 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30  lite3OsInMutex(0
154c0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
154d0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74  0;.  }..  /* Out
154e0 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73  ermost loop runs
154f0 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f   for at most two
15500 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72   iterations. Fir
15510 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a  st iteration we.
15520 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64    ** try to find
15530 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e   memory that can
15540 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74   be released wit
15550 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79  hout calling fsy
15560 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a  nc(). Second.  *
15570 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69  * iteration (whi
15580 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20  ch only runs if 
15590 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64  the first failed
155a0 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79   to free nReq by
155b0 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f  tes of.  ** memo
155c0 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  ry) is permitted
155d0 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29   to call fsync()
155e0 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75  . This is of cou
155f0 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20  rse much more . 
15600 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20   ** expensive.. 
15610 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
15620 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20  <=1; i++){..    
15630 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
15640 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70  all the SQLite p
15650 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20  agers opened by 
15660 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
15670 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ad. */.    for(p
15680 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b  =pTsdro->pPager;
15690 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c   p && (nReq<0 ||
156a0 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
156b0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
156c0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
156d0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  .      int rc;..
156e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63        /* For eac
156f0 68 20 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20  h pager, try to 
15700 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67  free as many pag
15710 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28  es as possible (
15720 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a  without .      *
15730 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28  * calling fsync(
15740 29 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  ) if this is the
15750 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
15760 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
15770 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  t .      ** loop
15780 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
15790 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
157a0 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f  OK==(rc = pager_
157b0 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20 26 70  recycle(p, i, &p
157c0 50 67 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20  Pg)) && pPg) {. 
157d0 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20         /* We've 
157e0 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
157f0 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
15800 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
15810 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a   been .        *
15820 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
15830 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
15840 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
15850 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
15860 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73         ** (pFirs
15870 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20  tSynced). It is 
15880 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c  still in the all
15890 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69   pages (pAll) li
158a0 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  st. .        ** 
158b0 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  Remove it from t
158c0 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20  his list before 
158d0 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20  freeing..       
158e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
158f0 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
15900 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
15910 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
15920 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
15930 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
15940 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
15950 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
15960 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
15970 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
15980 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f  );.        page_
15990 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
159a0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
159b0 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e      if( pPg==p->
159c0 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
159d0 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67     p->pAll = pPg
159e0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
159f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15a00 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70       for( pTmp=p
15a10 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e  ->pAll; pTmp->pN
15a20 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d  extAll!=pPg; pTm
15a30 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p=pTmp->pNextAll
15a40 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70   ){}.          p
15a50 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  Tmp->pNextAll = 
15a60 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
15a70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15a80 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71   nReleased += sq
15a90 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50  liteAllocSize(pP
15aa0 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
15ab0 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
15ac0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
15ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15ae0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
15af0 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
15b00 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
15b10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15b20 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   or .        ** 
15b30 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72  journal in pager
15b40 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20  _recycle(). The 
15b50 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74  error is not ret
15b60 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20  urned to the .  
15b70 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
15b80 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
15b90 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
15ba0 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
15bb0 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
15bc0 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20     ** The error 
15bd0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
15be0 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72   to the user (or
15bf0 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63   users, in the c
15c00 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase .        ** 
15c10 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65  of a shared page
15c20 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20  r cache) of the 
15c30 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20  pager for which 
15c40 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65  the error occure
15c50 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
15c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 72        assert( (r
15c70 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
15c80 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c  IOERR || rc==SQL
15c90 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20  ITE_FULL );.    
15ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
15cb0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
15cc0 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  RVED );.        
15cd0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72  pager_error(p, r
15ce0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
15cf0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
15d00 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
15d10 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
15d20 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
15d30 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  GEMENT */../*.**
15d40 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
15d50 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
15d60 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  in the shared lo
15d70 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ck required befo
15d80 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62  re.** data may b
15d90 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
15da0 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
15db0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
15dc0 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
15dd0 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
15de0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
15df0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
15e00 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65  c int pagerShare
15e10 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
15e20 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
15e30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
15e40 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
15e50 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
15e60 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  {.    if( !MEMDB
15e70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
15e80 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
15e90 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
15ea0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
15eb0 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ck ){.        rc
15ec0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
15ed0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
15ee0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
15ef0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15f00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15f10 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
15f20 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
15f30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15f40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
15f50 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
15f60 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
15f70 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49   }.  .      /* I
15f80 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
15f90 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
15fa0 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
15fb0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
15fc0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
15fd0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
15fe0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
15ff0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
16000 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a  deleted..      *
16010 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48  /.      if( hasH
16020 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
16030 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16040 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
16050 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
16060 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
16070 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
16080 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72          ** impor
16090 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
160a0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
160b0 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
160c0 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
160d0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
160e0 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
160f0 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
16100 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
16110 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
16120 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
16130 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
16140 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
16150 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
16160 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16170 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
16180 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
16190 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
161a0 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 20  ing it .        
161b0 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ** back..       
161c0 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   ** .        ** 
161d0 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
161e0 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
161f0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
16200 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
16210 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
16220 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
16230 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
16240 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
16250 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  il to.        **
16260 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e   obtain it's own
16270 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16280 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16290 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
162a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
162b0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
162c0 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
162d0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
162e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
162f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16300 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
16310 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
16320 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16330 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
16340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16350 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
16360 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
16370 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  E;. .        /* 
16380 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
16390 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
163a0 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
163b0 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
163c0 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62    ** we are unab
163d0 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
163e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20  ournal file. .  
163f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
16400 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
16410 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
16420 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
16430 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
16440 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
16450 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
16460 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
16470 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
16480 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a   holds.        *
16490 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
164a0 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
164b0 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
164c0 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
164d0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73      ** processes
164e0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75   opening the jou
164f0 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65  rnal at the same
16500 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a   time..        *
16510 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
16520 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
16530 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Only(pPager->zJo
16540 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
16550 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jfd);.        if
16560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
16580 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
16590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
165a0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
165b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
165c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
165d0 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
165e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
165f0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
16600 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
16610 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
16620 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
16630 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
16640 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
16650 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
16660 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  .        /* Play
16670 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
16680 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
16690 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
166a0 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  write.        **
166b0 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
166c0 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
166d0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k..        */.  
166e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
166f0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
16700 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
16710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
16730 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
16740 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
16760 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
16770 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
16780 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 31 20    PgHdr *pPage1 
16790 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
167a0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
167b0 20 20 20 69 66 28 20 70 50 61 67 65 31 20 29 7b     if( pPage1 ){
167c0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 6c 69 6e  .          unlin
167d0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
167e0 72 2c 20 70 50 61 67 65 31 29 3b 0a 20 20 20 20  r, pPage1);.    
167f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 61      }..        a
16800 73 73 65 72 74 28 20 21 70 61 67 65 72 5f 6c 6f  ssert( !pager_lo
16810 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 20  okup(pPager, 1) 
16820 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
16830 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
16840 69 72 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26  ire(pPager, 1, &
16850 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 20 20  pPage1, 0);.    
16860 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16870 54 45 5f 4f 4b 20 29 7b 0a 09 20 20 2f 2a 20 54  TE_OK ){..  /* T
16880 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
16890 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 6f  r is stored at o
168a0 66 66 73 65 74 20 32 34 2e 20 53 65 65 20 61 6c  ffset 24. See al
168b0 73 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  so.          ** 
168c0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
168d0 65 63 6f 75 6e 74 65 72 28 29 2e 0a 20 20 20 20  ecounter()..    
168e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
168f0 20 20 20 75 33 32 20 69 43 68 61 6e 67 65 43 6f     u32 iChangeCo
16900 75 6e 74 20 3d 20 72 65 74 72 69 65 76 65 33 32  unt = retrieve32
16910 62 69 74 73 28 70 50 61 67 65 31 2c 20 32 34 29  bits(pPage1, 24)
16920 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
16930 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
16940 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
16950 65 72 55 6e 72 65 66 28 70 50 61 67 65 31 29 3b  erUnref(pPage1);
16960 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
16970 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20  r->nRef--;.     
16980 20 20 20 20 20 69 66 28 20 69 43 68 61 6e 67 65       if( iChange
16990 43 6f 75 6e 74 21 3d 70 50 61 67 65 72 2d 3e 69  Count!=pPager->i
169a0 43 68 61 6e 67 65 43 6f 75 6e 74 20 29 7b 0a 20  ChangeCount ){. 
169b0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72             pager
169c0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
169d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
169e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 43        pPager->iC
169f0 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 69 43 68  hangeCount = iCh
16a00 61 6e 67 65 43 6f 75 6e 74 3b 0a 20 20 20 20 20  angeCount;.     
16a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16a20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
16a30 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
16a40 52 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  RED;.  }..  retu
16a50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16a60 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
16a70 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
16a80 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
16a90 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
16aa0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
16ab0 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
16ac0 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
16ad0 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
16ae0 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
16af0 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
16b00 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
16b10 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
16b20 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
16b30 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
16b40 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
16b50 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
16b60 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
16b70 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
16b80 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
16b90 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
16ba0 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
16bb0 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
16bc0 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
16bd0 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
16be0 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
16bf0 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
16c00 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
16c10 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
16c20 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
16c30 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
16c40 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
16c50 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
16c60 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
16c70 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
16c80 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
16c90 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
16ca0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
16cb0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
16cc0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
16cd0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
16ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
16cf0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
16d00 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c  s routine and _l
16d10 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
16d20 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
16d30 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
16d40 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
16d50 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
16d60 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
16d70 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
16d80 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
16d90 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
16da0 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75  n whereas _looku
16db0 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
16dc0 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
16dd0 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
16de0 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
16df0 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
16e00 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
16e10 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
16e20 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
16e30 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
16e40 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
16e50 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20  _lookup() never 
16e60 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
16e70 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
16e80 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
16e90 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
16ea0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 6c 72 46  s..**.** If clrF
16eb0 6c 61 67 20 69 73 20 66 61 6c 73 65 2c 20 74 68  lag is false, th
16ec0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
16ed0 61 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  are actually rea
16ee0 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20  d from disk..** 
16ef0 49 66 20 63 6c 66 46 6c 61 67 20 69 73 20 74 72  If clfFlag is tr
16f00 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ue, it means the
16f10 20 70 61 67 65 20 69 73 20 61 62 6f 75 74 20 74   page is about t
16f20 6f 20 62 65 20 65 72 61 73 65 64 20 61 6e 64 0a  o be erased and.
16f30 2a 2a 20 72 65 77 72 69 74 74 65 6e 20 77 69 74  ** rewritten wit
16f40 68 6f 75 74 20 66 69 72 73 74 20 62 65 69 6e 67  hout first being
16f50 20 72 65 61 64 20 73 6f 20 74 68 65 72 65 20 69   read so there i
16f60 73 20 6e 6f 20 70 6f 69 6e 74 20 69 74 20 64 6f  s no point it do
16f70 69 6e 67 0a 2a 2a 20 74 68 65 20 64 69 73 6b 20  ing.** the disk 
16f80 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  I/O..*/.int sqli
16f90 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
16fa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
16fb0 67 6e 6f 20 70 67 6e 6f 2c 20 44 62 50 61 67 65  gno pgno, DbPage
16fc0 20 2a 2a 70 70 50 61 67 65 2c 20 69 6e 74 20 63   **ppPage, int c
16fd0 6c 72 46 6c 61 67 29 7b 0a 20 20 50 67 48 64 72  lrFlag){.  PgHdr
16fe0 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
16ff0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
17000 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
17010 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  _UNLOCK || pPage
17020 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e  r->nRef>0 || pgn
17030 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  o==1 );..  /* Th
17040 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
17050 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
17060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
17070 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
17080 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
17090 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
170a0 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73   zero, is reques
170b0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
170c0 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
170d0 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c  GNO || pgno==0 |
170e0 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
170f0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
17100 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17110 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
17120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
17130 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
17140 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
17150 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
17160 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17170 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
17180 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
17190 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
171a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
171b0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
171c0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
171d0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
171e0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
171f0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
17200 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
17210 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
17220 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
17230 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
17240 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
17250 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
17260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17270 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17280 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
17290 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
172a0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
172b0 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  );..  pPg = page
172c0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
172d0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
172e0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
172f0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
17300 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
17310 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
17320 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45     int h;.    TE
17330 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
17340 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28 20  nMiss);.    if( 
17350 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
17360 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
17370 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
17380 30 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 0a 20 20  0 || MEMDB ||.  
17390 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 70        (pPager->p
173a0 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26  FirstSynced==0 &
173b0 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  & pPager->doNotS
173c0 79 6e 63 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ync).    ){.    
173d0 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
173e0 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  w page */.      
173f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
17400 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  e>=pPager->nHash
17410 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
17420 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61  r_resize_hash_ta
17430 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20  ble(pPager,.    
17440 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
17450 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a  Hash<256 ? 256 :
17460 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32   pPager->nHash*2
17470 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
17480 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20  Pager->nHash==0 
17490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
174a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
174b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
174c0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20    }.      pPg = 
174d0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
174e0 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
174f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
17520 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
17530 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17550 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
17560 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
17570 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69  tory) );.      i
17580 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
17590 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
175a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
175b0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
175c0 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Pg, 0, sizeof(*p
175d0 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg));.      if( 
175e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
175f0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
17600 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
17610 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67  r), 0, sizeof(Pg
17620 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20  History));.     
17630 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
17640 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
17650 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41       pPg->pNextA
17660 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
17670 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  l;.      pPager-
17680 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20  >pAll = pPg;.   
17690 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
176a0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ++;.      if( pP
176b0 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67  ager->nPage>pPag
176c0 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a  er->nMaxPage ){.
176d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
176e0 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
176f0 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  ==(pPager->nPage
17700 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  -1) );.        p
17710 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b  Pager->nMaxPage+
17720 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
17730 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
17740 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
17750 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b  Pager, 1, &pPg);
17760 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17780 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
177a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
177b0 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
177c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
177d0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
177e0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
177f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
17800 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
17810 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
17820 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
17830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
17840 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  eckMemory(pPager
17850 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->aInJournal, pg
17860 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73  no/8);.      ass
17870 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
17880 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
17890 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
178a0 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
178b0 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
178c0 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
178d0 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  =0;.      pPg->n
178e0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
178f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
17900 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
17910 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
17920 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
17930 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17940 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  >aInStmt && (int
17950 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
17960 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20  tmtSize.        
17970 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
17980 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d  >aInStmt[pgno/8]
17990 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
179a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  )!=0 ){.      pa
179b0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
179c0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ist(pPg);.    }e
179d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  lse{.      page_
179e0 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
179f0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
17a00 7d 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  }.    makeClean(
17a10 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e  pPg);.    pPg->n
17a20 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46  Ref = 1;.    REF
17a30 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20  INFO(pPg);..    
17a40 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
17a50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17a60 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
17a70 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
17a80 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
17a90 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  ger), 0, pPager-
17aa0 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a  >nExtra);.    }.
17ab0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17ac0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
17ad0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
17ae0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72  ef(pPg);.      r
17af0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
17b00 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ode;.      retur
17b10 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
17b20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
17b30 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c   page with data,
17b40 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69   either by readi
17b50 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
17b60 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
17b70 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20  , or by setting 
17b80 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20  the entire page 
17b90 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  to zero..    */.
17ba0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
17bb0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
17bc0 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20  ager)<(int)pgno 
17bd0 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 20 20 20 20  || MEMDB.       
17be0 20 20 7c 7c 20 28 63 6c 72 46 6c 61 67 20 26 26    || (clrFlag &&
17bf0 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73   !pPager->always
17c00 52 6f 6c 6c 62 61 63 6b 29 20 0a 20 20 20 20 29  Rollback) .    )
17c10 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
17c20 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
17c30 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
17c40 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  geSize);.    }el
17c50 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
17c60 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20  ( MEMDB==0 );.  
17c70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17c80 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
17c90 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
17ca0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
17cb0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
17cc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17cd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17ce0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
17cf0 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
17d00 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20 20 20  ATA(pPg),.      
17d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17d30 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
17d40 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45   }.      IOTRACE
17d50 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
17d60 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
17d70 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 46  .      TRACE3("F
17d80 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
17d90 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
17da0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
17db0 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50  .      CODEC1(pP
17dc0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
17dd0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
17de0 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  gno, 3);.      i
17df0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17e00 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
17e10 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
17e20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
17e30 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  pgno = 0;.      
17e40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
17e50 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
17e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17e70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17e80 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
17e90 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 20 20  er->nRead);.    
17ea0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
17eb0 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20  * Link the page 
17ec0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68 61  into the page ha
17ed0 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  sh table */.    
17ee0 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
17ef0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
17f00 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
17f10 30 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  0 );.    pPg->pN
17f20 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
17f30 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
17f40 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
17f50 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
17f60 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
17f70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17f80 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
17f90 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
17fa0 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
17fb0 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
17fc0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69  = pPg;.    }..#i
17fd0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
17fe0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
17ff0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
18000 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
18010 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
18020 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
18030 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
18040 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
18050 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70   */.    assert(p
18060 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c  Pager->nRef>0 ||
18070 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 54   pgno==1);.    T
18080 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
18090 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65  >nHit);.    page
180a0 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
180b0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
180c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
180d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
180e0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
180f0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
18100 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
18110 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
18120 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
18130 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
18140 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
18150 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
18160 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
18170 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
18180 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
18190 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
181a0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
181b0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
181c0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
181d0 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
181e0 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
181f0 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
18200 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
18210 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
18220 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
18230 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
18240 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
18250 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
18260 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
18270 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
18280 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
18290 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
182a0 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
182b0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
182c0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
182d0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
182e0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
182f0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
18300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
18310 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  no!=0 );..  if( 
18320 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
18330 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
18340 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
18350 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
18360 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
18370 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
18380 54 45 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_FULL) ){.    
18390 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
183a0 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
183b0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
183c0 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
183d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67   return 0;.  pag
183e0 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
183f0 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
18400 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
18410 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
18420 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
18430 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
18440 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
18450 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
18460 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
18470 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
18480 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
18490 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
184a0 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
184b0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
184c0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
184d0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
184e0 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
184f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  t sqlite3PagerUn
18500 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
18510 7b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  {..  /* Decremen
18520 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
18530 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
18540 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  age.  */.  asser
18550 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
18560 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pPg->nRef--;
18570 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
18580 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
18590 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  Pg);..  /* When 
185a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
185b0 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61  ferences to a pa
185c0 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c  ge reach 0, call
185d0 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75   the.  ** destru
185e0 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65  ctor and add the
185f0 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
18600 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elist..  */.  if
18610 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
18620 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
18630 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ger;.    pPager 
18640 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
18650 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
18660 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  e = 0;.    pPg->
18670 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67  pPrevFree = pPag
18680 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70  er->pLast;.    p
18690 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
186a0 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
186b0 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
186c0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
186d0 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
186e0 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pPg;.    }else{.
186f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
18700 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  irst = pPg;.    
18710 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
18720 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50  eedSync==0 && pP
18730 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
18740 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ed==0 ){.      p
18750 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
18760 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ced = pPg;.    }
18770 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18780 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
18790 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
187a0 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70  estructor(pPg, p
187b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
187c0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
187d0 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
187e0 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
187f0 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
18800 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
18810 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
18820 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
18830 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
18840 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
18850 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
18860 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18870 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
18880 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74    /* pager_reset
18890 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 20  (pPager); */.   
188a0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
188b0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
188c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
188d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
188e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
188f0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
18900 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
18910 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
18920 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
18930 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
18940 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18950 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
18960 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
18970 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
18980 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
18990 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
189a0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
189b0 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
189c0 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
189d0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
189e0 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
189f0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
18a00 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
18a10 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
18a20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
18a30 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
18a40 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
18a50 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
18a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18a70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18a80 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
18a90 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
18aa0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
18ab0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
18ac0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
18ad0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18ae0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
18af0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
18b00 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
18b10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
18b20 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
18b30 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
18b40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
18b50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18b60 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
18b70 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
18b80 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
18b90 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
18ba0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
18bb0 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
18bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
18bf0 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  le);.  pPager->j
18c00 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
18c10 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
18c20 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
18c30 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
18c40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18c50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
18c60 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
18c70 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
18c80 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
18c90 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
18ca0 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
18cb0 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  sync);.  sqlite3
18cc0 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
18cd0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
18ce0 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
18cf0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
18d00 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e  rectory(pPager->
18d10 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69  jfd, pPager->zDi
18d20 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67  rectory);.  pPag
18d30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18d40 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
18d50 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
18d60 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
18d70 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
18d80 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
18d90 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
18da0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
18db0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
18dc0 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
18dd0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
18de0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
18df0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
18e00 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
18e10 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
18e20 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72  er->dbSize;..  r
18e30 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
18e40 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  Hdr(pPager);..  
18e50 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
18e60 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
18e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18e80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18e90 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
18ea0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
18eb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
18ec0 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
18ed0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
18ee0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
18ef0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
18f00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18f10 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18f20 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
18f30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18f40 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
18f50 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
18f60 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
18f70 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
18f80 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
18f90 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
18fa0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
18fb0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
18fc0 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
18fd0 6c 75 72 65 2c 20 74 68 65 6e 20 77 65 20 77 69  lure, then we wi
18fe0 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e  ll not be closin
18ff0 67 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  g the pager.    
19000 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65  ** file. So dele
19010 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66  te any journal f
19020 69 6c 65 20 77 65 20 6d 61 79 20 68 61 76 65 20  ile we may have 
19030 6a 75 73 74 20 63 72 65 61 74 65 64 2e 20 4f 74  just created. Ot
19040 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20  herwise,.    ** 
19050 74 68 65 20 73 79 73 74 65 6d 20 77 69 6c 6c 20  the system will 
19060 67 65 74 20 63 6f 6e 66 75 73 65 64 2c 20 77 65  get confused, we
19070 20 68 61 76 65 20 61 20 72 65 61 64 2d 6c 6f 63   have a read-loc
19080 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  k on the file an
19090 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65  d a.    ** myste
190a0 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61  rious journal ha
190b0 73 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68  s appeared in th
190c0 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20  e filesystem..  
190d0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
190e0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
190f0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 65  >zJournal);.  }e
19100 6c 73 65 7b 0a 20 20 20 20 70 61 67 65 72 5f 72  lse{.    pager_r
19110 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
19120 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19130 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
19140 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
19150 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
19160 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
19170 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
19180 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
19190 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
191a0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
191b0 67 65 72 43 6f 6d 6d 69 74 28 29 20 69 73 20 63  gerCommit() is c
191c0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
191d0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
191e0 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
191f0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
19200 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20  PagerClose() is 
19210 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
19220 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
19230 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
19240 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
19250 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
19260 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
19270 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
19280 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
19290 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
192a0 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
192b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
192c0 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
192d0 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
192e0 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
192f0 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
19300 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19310 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
19320 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
19330 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
19340 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
19350 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
19360 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
19370 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
19380 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
19390 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
193a0 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
193b0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
193c0 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
193d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
193e0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
193f0 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
19400 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
19410 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
19420 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
19430 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
19440 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
19450 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
19460 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
19470 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
19480 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
19490 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
194a0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
194b0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
194c0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
194d0 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
194e0 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
194f0 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
19500 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
19510 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
19520 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
19530 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
19540 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
19550 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
19560 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
19570 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
19580 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
19590 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
195a0 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
195b0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
195c0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
195d0 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
195e0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62  te3PagerBegin(Db
195f0 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65  Page *pPg, int e
19600 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20  xFlag){.  Pager 
19610 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
19620 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
19630 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
19640 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
19650 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
19660 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
19670 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
19680 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
19690 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
196a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
196b0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
196c0 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  al==0 );.    if(
196d0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
196e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
196f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
19700 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
19710 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
19720 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
19730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
19740 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
19750 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
19760 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
19770 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19780 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
19790 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
197a0 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
197b0 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
197c0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
197d0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
197e0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
197f0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
19800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19810 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
19820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19830 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
19850 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
19860 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
19870 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E2("TRANSACTION 
19880 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
19890 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69  Pager));.      i
198a0 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
198b0 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72  urnal && !pPager
198c0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
198d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
198e0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
198f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
19900 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19910 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
19920 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79  ake a page dirty
19930 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79  .  Set its dirty
19940 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74   flag and add it
19950 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a   to the dirty.**
19960 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
19970 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44  tatic void makeD
19980 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29  irty(PgHdr *pPg)
19990 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
199a0 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ty==0 ){.    Pag
199b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
199c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
199d0 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
199e0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
199f0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
19a00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19a10 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  pDirty ){.      
19a20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
19a30 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
19a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
19a50 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b  >pPrevDirty = 0;
19a60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
19a70 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d  rty = pPg;.  }.}
19a80 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
19a90 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61  age clean.  Clea
19aa0 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20  r its dirty bit 
19ab0 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72  and remove it fr
19ac0 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  om the.** dirty 
19ad0 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
19ae0 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
19af0 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ean(PgHdr *pPg){
19b00 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
19b10 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69  y ){.    pPg->di
19b20 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
19b30 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a   pPg->pDirty ){.
19b40 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74        pPg->pDirt
19b50 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  y->pPrevDirty = 
19b60 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b  pPg->pPrevDirty;
19b70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
19b80 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29  Pg->pPrevDirty )
19b90 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
19ba0 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20  evDirty->pDirty 
19bb0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
19bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19bd0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69  pPg->pPager->pDi
19be0 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  rty = pPg->pDirt
19bf0 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  y;.    }.  }.}..
19c00 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
19c10 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
19c20 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
19c30 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
19c40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
19c50 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
19c60 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
19c70 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
19c80 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
19c90 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
19ca0 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
19cb0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
19cc0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
19cd0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
19ce0 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
19cf0 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
19d00 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
19d10 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
19d20 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
19d30 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
19d40 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
19d50 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
19d60 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
19d70 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
19d80 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
19d90 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
19da0 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
19db0 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
19dc0 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
19dd0 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
19de0 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
19df0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
19e00 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
19e10 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
19e20 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
19e30 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
19e40 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
19e50 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
19e60 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
19e70 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
19e80 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
19e90 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
19ea0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
19eb0 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
19ec0 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
19ed0 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
19ee0 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
19ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
19f00 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33  mit() or sqlite3
19f10 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
19f20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
19f30 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
19f40 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
19f50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
19f60 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
19f70 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72 20  A(pPg);.  Pager 
19f80 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
19f90 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
19fa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
19fb0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
19fc0 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
19fd0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
19fe0 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  { .    return pP
19ff0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1a000 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1a010 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
1a020 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
1a030 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
1a040 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
1a050 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
1a060 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
1a070 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
1a080 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
1a090 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
1a0a0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1a0b0 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
1a0c0 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
1a0d0 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
1a0e0 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65  way..  */.  make
1a0f0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
1a100 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1a110 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74   && (pPg->inStmt
1a120 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   || pPager->stmt
1a130 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20  InUse==0) ){.   
1a140 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1a150 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  che = 1;.  }else
1a160 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  {..    /* If we 
1a170 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
1a180 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1a190 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
1a1a0 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  .    ** written 
1a1b0 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
1a1c0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  on journal or th
1a1d0 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e ckeckpoint jou
1a1e0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62  rnal.    ** or b
1a1f0 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oth..    **.    
1a200 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
1a210 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
1a220 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1a230 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
1a240 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69    ** create it i
1a250 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  f it does not.. 
1a260 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1a270 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1a280 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
1a290 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a2a0 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c  3PagerBegin(pPg,
1a2b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1a2c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a2d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a2e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1a2f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1a300 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1a310 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1a320 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
1a330 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
1a340 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
1a350 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
1a360 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1a370 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a380 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1a390 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
1a3a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1a3b0 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
1a3c0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1a3d0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1a3e0 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
1a3f0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
1a400 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1a410 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
1a420 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
1a430 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
1a440 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1a450 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
1a460 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
1a470 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1a480 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
1a490 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1a4a0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
1a4b0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
1a4c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a4d0 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
1a4e0 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a  && (pPager->useJ
1a4f0 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29  ournal || MEMDB)
1a500 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
1a510 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
1a520 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1a530 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ze ){.        in
1a540 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  t szPg;.        
1a550 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1a560 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
1a570 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1a580 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1a590 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
1a5a0 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20  TRACE3("JOURNAL 
1a5b0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1a5c0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1a5d0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1a5e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
1a5f0 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b  ist->pOrig==0 );
1a600 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
1a610 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65  ->pOrig = sqlite
1a620 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
1a630 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
1a640 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69           if( pHi
1a650 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
1a660 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1a670 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47  pHist->pOrig, PG
1a680 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1a690 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1a6a0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ze);.          }
1a6b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1a6c0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b            u32 ck
1a6d0 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20  sum, saved;.    
1a6e0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
1a6f0 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20  a2, *pEnd;.     
1a700 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
1a710 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
1a720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a730 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
1a740 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
1a750 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
1a760 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
1a770 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
1a780 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
1a790 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
1a7a0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
1a7b0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1a7c0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
1a7d0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
1a7e0 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20           pData2 
1a7f0 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1a800 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
1a810 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 7);.         
1a820 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
1a830 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
1a840 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  *)pData2);.     
1a850 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74       pEnd = pDat
1a860 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67  a2 + pPager->pag
1a870 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  eSize;.         
1a880 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20   pData2 -= 4;.  
1a890 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20          saved = 
1a8a0 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20  *(u32*)pEnd;.   
1a8b0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
1a8c0 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20  (pEnd, cksum);. 
1a8d0 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20           szPg = 
1a8e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a8f0 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  +8;.          pu
1a900 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20  t32bits(pData2, 
1a910 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1a920 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a930 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1a940 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73  ->jfd, pData2, s
1a950 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  zPg);.          
1a960 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
1a970 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
1a980 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1a990 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1a9a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1a9b0 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29  ournalOff, szPg)
1a9c0 29 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ).          pPag
1a9d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
1a9e0 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  = szPg;.        
1a9f0 20 20 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41    TRACE4("JOURNA
1aa00 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
1aa10 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1aa30 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1aa40 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
1aa50 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
1aa60 20 20 20 20 20 2a 28 75 33 32 2a 29 70 45 6e 64       *(u32*)pEnd
1aa70 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20 20 2f 2a   = saved;...  /*
1aa80 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
1aa90 63 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  cured writing to
1aaa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1aab0 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
1aac0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1aad0 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
1aae0 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65  back by the laye
1aaf0 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  r above..       
1ab00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1ab10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ab20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1ab30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ab40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1ab50 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
1ab60 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
1ab70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1ab80 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
1ab90 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1aba0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
1abb0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1abc0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1abd0 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
1abe0 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
1abf0 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
1ac00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ac10 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
1ac20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
1ac30 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1ac40 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1ac50 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
1ac60 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
1ac70 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
1ac80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ac90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1aca0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d  se{.        pPg-
1acb0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
1acc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1acd0 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
1ace0 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
1acf0 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25  TRACE4("APPEND %
1ad00 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
1ad10 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
1ad20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1ad30 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1ad40 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
1ad50 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ync);.      }.  
1ad60 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
1ad70 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
1ad80 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1ad90 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
1ada0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1adb0 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nal = 1;.    }. 
1adc0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
1add0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1ade0 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
1adf0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
1ae00 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
1ae10 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1ae20 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
1ae30 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1ae40 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
1ae50 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
1ae60 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
1ae70 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
1ae80 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
1ae90 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
1aea0 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
1aeb0 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
1aec0 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
1aed0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1aee0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1aef0 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
1af00 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1af10 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
1af20 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Size ){.      as
1af30 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
1af40 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
1af50 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1af60 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
1af70 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1af80 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
1af90 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1afa0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1afb0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
1afc0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
1afd0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
1afe0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
1aff0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
1b000 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
1b010 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
1b020 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
1b030 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
1b040 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  py(pHist->pStmt,
1b050 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1b060 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
1b070 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1b080 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33  }.        TRACE3
1b090 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
1b0a0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1b0b0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1b0c0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1b0d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b0e0 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43  char *pData2 = C
1b0f0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
1b100 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
1b110 37 29 2d 34 3b 0a 20 20 20 20 20 20 20 20 70 75  7)-4;.        pu
1b120 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20  t32bits(pData2, 
1b130 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1b140 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b150 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1b160 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  stfd, pData2, pP
1b170 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
1b180 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
1b190 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
1b1a0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1b1b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1b1c0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1b1d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b1e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b1f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b210 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1b220 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
1b230 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
1b240 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
1b250 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1b260 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1b270 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1b280 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  7);.      }.    
1b290 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
1b2a0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
1b2b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
1b2c0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
1b2d0 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
1b2e0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
1b2f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1b300 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
1b310 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
1b320 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e  bSize<(int)pPg->
1b330 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
1b340 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
1b350 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  ->pgno;.    if( 
1b360 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1b370 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e  ->dbSize==PENDIN
1b380 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
1b390 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
1b3a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b   pPager->dbSize+
1b3b0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
1b3c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b3d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b3e0 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b   is used to mark
1b3f0 20 61 20 64 61 74 61 2d 70 61 67 65 20 61 73 20   a data-page as 
1b400 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65  writable. It use
1b410 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74  s .** pager_writ
1b420 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f  e() to open a jo
1b430 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
1b440 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1b450 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72   open).** and wr
1b460 69 74 65 20 74 68 65 20 70 61 67 65 20 2a 70 44  ite the page *pD
1b470 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ata to the journ
1b480 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  al..**.** The di
1b490 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
1b4a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1b4b0 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
1b4c0 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
1b4d0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
1b4e0 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
1b4f0 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
1b500 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
1b510 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
1b520 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
1b530 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
1b540 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
1b550 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
1b560 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1b570 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b580 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1b590 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1b5a0 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
1b5b0 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
1b5c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b5d0 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
1b5e0 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
1b5f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1b600 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
1b610 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
1b620 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
1b630 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
1b640 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69  >pageSize);..  i
1b650 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61  f( !MEMDB && nPa
1b660 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
1b670 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
1b680 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
1b690 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1b6a0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
1b6b0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
1b6c0 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
1b6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1b6e0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
1b6f0 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
1b700 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
1b710 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
1b720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b730 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
1b740 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
1b750 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
1b760 6e 74 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53  nt ii;..    /* S
1b770 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
1b780 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
1b790 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
1b7a0 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
1b7b0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
1b7c0 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
1b7d0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
1b7e0 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
1b7f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1b800 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1b810 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
1b820 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Sync==0 );.    p
1b830 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1b840 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   = 1;..    /* Th
1b850 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
1b860 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
1b870 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
1b880 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
1b890 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
1b8a0 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
1b8b0 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
1b8c0 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
1b8d0 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
1b8e0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1b8f0 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
1b900 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
1b910 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
1b920 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
1b930 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
1b940 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61  )) + 1;..    nPa
1b950 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65  geCount = sqlite
1b960 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1b970 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1b980 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
1b990 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1b9a0 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
1b9b0 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
1b9c0 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
1b9d0 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
1b9e0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
1b9f0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1ba00 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
1ba10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ba20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
1ba30 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
1ba40 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
1ba50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
1ba60 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
1ba70 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
1ba80 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
1ba90 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
1baa0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
1bab0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
1bac0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
1bad0 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
1bae0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49   if( !pPager->aI
1baf0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d  nJournal || pg==
1bb00 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20  pPg->pgno || .  
1bb10 20 20 20 20 20 20 20 20 70 67 3e 70 50 61 67 65          pg>pPage
1bb20 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c  r->origDbSize ||
1bb30 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f   !(pPager->aInJo
1bb40 75 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c  urnal[pg/8]&(1<<
1bb50 28 70 67 26 37 29 29 29 0a 20 20 20 20 20 20 29  (pg&7))).      )
1bb60 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
1bb70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
1bb80 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1bb90 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
1bba0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
1bbb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1bbc0 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
1bbd0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1bbe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bbf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1bc00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1bc10 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
1bc20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1bc30 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1bc40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1bc50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1bc60 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1bc70 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
1bc80 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Sync==1 );.    p
1bc90 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1bca0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1bcb0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1bcc0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
1bcd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1bce0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1bcf0 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
1bd00 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1bd10 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
1bd20 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
1bd30 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
1bd40 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
1bd50 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
1bd60 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
1bd70 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
1bd80 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1bd90 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  page..*/.#ifndef
1bda0 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69   NDEBUG.int sqli
1bdb0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
1bdc0 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  ble(DbPage *pPg)
1bdd0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
1bde0 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  dirty;.}.#endif.
1bdf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1be00 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  OMIT_VACUUM./*.*
1be10 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f  * Replace the co
1be20 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c  ntent of a singl
1be30 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  e page with the 
1be40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
1be50 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75  he third.** argu
1be60 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
1be70 69 74 65 33 50 61 67 65 72 4f 76 65 72 77 72 69  ite3PagerOverwri
1be80 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
1be90 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
1bea0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
1beb0 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
1bec0 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
1bed0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1bee0 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a  r, pgno, &pPg);.
1bef0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bf00 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1bf10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1bf20 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  e(pPg);.    if( 
1bf30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1bf40 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71  .      memcpy(sq
1bf50 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
1bf60 61 28 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70  a(pPg), pData, p
1bf70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1bf80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1bf90 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1bfa0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
1bfb0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
1bfc0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
1bfd0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
1bfe0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
1bff0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
1c000 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
1c010 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1c020 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20   on page "pgno" 
1c030 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
1c040 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
1c050 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
1c060 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
1c070 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  rty..**.** The o
1c080 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
1c090 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
1c0a0 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
1c0b0 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
1c0c0 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
1c0d0 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
1c0e0 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
1c0f0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
1c100 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
1c110 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
1c120 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
1c130 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
1c140 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
1c150 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72  zation, together
1c160 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c   with the.** sql
1c170 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1c180 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
1c190 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
1c1a0 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
1c1b0 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
1c1c0 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
1c1d0 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
1c1e0 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
1c1f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1c200 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1c210 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77  led, set the alw
1c220 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
1c230 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62   to true..** Sub
1c240 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
1c250 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1c260 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
1c270 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a  the same page.**
1c280 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72   will thereafter
1c290 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68   be ignored.  Th
1c2a0 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
1c2b0 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c  to avoid a probl
1c2c0 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61  em.** where a pa
1c2d0 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20  ge with data is 
1c2e0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
1c2f0 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65  elist during one
1c300 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72   part of.** a tr
1c310 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72  ansaction then r
1c320 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1c330 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
1c340 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20  a later part.** 
1c350 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e  of the same tran
1c360 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  saction and reus
1c370 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ed for some othe
1c380 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e  r purpose.  When
1c390 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20   it.** is first 
1c3a0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
1c3b0 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  elist, this rout
1c3c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
1c3d0 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20  When reused,.** 
1c3e0 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  the dont_rollbac
1c3f0 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
1c400 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
1c410 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e  use the page con
1c420 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61  tains.** critica
1c430 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
1c440 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
1c450 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20   it gets rolled 
1c460 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a  back in spite.**
1c470 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c   of the dont_rol
1c480 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
1c490 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1c4a0 65 72 44 6f 6e 74 57 72 69 74 65 28 50 61 67 65  erDontWrite(Page
1c4b0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1c4c0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
1c4d0 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  pPg;..  if( MEMD
1c4e0 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70  B ) return;..  p
1c4f0 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
1c500 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
1c510 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d  .  assert( pPg!=
1c520 30 20 29 3b 20 20 2f 2a 20 57 65 20 6e 65 76 65  0 );  /* We neve
1c530 72 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f 77 72 69  r call _dont_wri
1c540 74 65 20 75 6e 6c 65 73 73 20 74 68 65 20 70 61  te unless the pa
1c550 67 65 20 69 73 20 69 6e 20 6d 65 6d 20 2a 2f 0a  ge is in mem */.
1c560 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
1c570 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28  lback = 1;.  if(
1c580 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21   pPg->dirty && !
1c590 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1c5a0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1c5b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1c5c0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
1c5d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c5e0 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67  dbSize==(int)pPg
1c5f0 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72  ->pgno && pPager
1c600 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61  ->origDbSize<pPa
1c610 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
1c620 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1c630 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73  pages is the las
1c640 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
1c650 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
1c660 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20  has grown.      
1c670 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  ** during the cu
1c680 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1c690 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d  n, then do NOT m
1c6a0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
1c6b0 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  clean..      ** 
1c6c0 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  When the databas
1c6d0 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65  e file grows, we
1c6e0 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   must make sure 
1c6f0 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1c700 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73  ge.      ** gets
1c710 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73   written at leas
1c720 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74  t once so that t
1c730 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c  he disk file wil
1c740 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74  l be the correct
1c750 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20  .      ** size. 
1c760 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72  If you do not wr
1c770 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e  ite this page an
1c780 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
1c790 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
1c7a0 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73  on the disk ends
1c7b0 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d   up being too sm
1c7c0 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65  all, that can le
1c7d0 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20  ad to database. 
1c7e0 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69       ** corrupti
1c7f0 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65  on during the ne
1c800 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  xt transaction..
1c810 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
1c820 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33  se{.      TRACE3
1c830 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
1c840 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1c850 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1c860 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
1c870 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
1c880 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1c890 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65  gno)).      make
1c8a0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64  Clean(pPg);.#ifd
1c8b0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1c8c0 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
1c8d0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
1c8e0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
1c8f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1c900 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  }.}../*.** A cal
1c910 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
1c920 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
1c930 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c  r that if a roll
1c940 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  back occurs,.** 
1c950 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1c960 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ary to restore t
1c970 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67  he data on the g
1c980 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73  iven page.  This
1c990 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
1c9a0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
1c9b0 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64  t have to record
1c9c0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1c9d0 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61  in the.** rollba
1c9e0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76  ck journal..*/.v
1c9f0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1ca00 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
1ca10 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
1ca20 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1ca30 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73  ->pPager;..  ass
1ca40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1ca50 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1ca60 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1ca70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1ca80 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1ca90 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
1caa0 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
1cab0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1cac0 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75   || MEMDB ) retu
1cad0 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
1cae0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
1caf0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
1cb00 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1cb10 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1cb20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1cb30 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
1cb40 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1cb50 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1cb60 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1cb70 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
1cb80 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
1cb90 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1cba0 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
1cbb0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1cbc0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1cbd0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1cbe0 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
1cbf0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1cc00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
1cc10 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
1cc20 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
1cc30 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
1cc40 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1cc50 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 47  .    IOTRACE(("G
1cc60 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
1cc70 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1cc80 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70  no)).  }.  if( p
1cc90 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1cca0 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
1ccb0 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1ccc0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
1ccd0 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
1cce0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1ccf0 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1cd00 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1cd10 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
1cd20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1cd30 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
1cd40 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1cd50 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1cd60 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1cd70 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f  );.    page_add_
1cd80 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1cd90 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1cda0 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
1cdb0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
1cdc0 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
1cdd0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
1cde0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
1cdf0 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
1ce00 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
1ce10 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
1ce20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
1ce30 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1ce40 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
1ce50 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
1ce60 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
1ce70 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
1ce80 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1ce90 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
1cea0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
1ceb0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
1cec0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ced0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1cee0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1cef0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1cf00 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
1cf10 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
1cf20 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1cf30 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28  R;.  }.  TRACE2(
1cf40 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
1cf50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1cf60 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1cf70 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1cf80 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1cf90 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1cfa0 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
1cfb0 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
1cfc0 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
1cfd0 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
1cfe0 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
1cff0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1d000 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
1d010 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
1d020 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1d030 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1d040 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
1d050 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
1d060 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1d070 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
1d080 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  y;.    }.    pPa
1d090 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
1d0a0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1d0b0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
1d0c0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
1d0d0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
1d0e0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
1d0f0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1d100 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1d110 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
1d120 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
1d130 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
1d140 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
1d150 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
1d160 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
1d170 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
1d180 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
1d190 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
1d1a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1d1b0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
1d1c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1d1d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1d1e0 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
1d1f0 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ache==0 ){.    /
1d200 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69  * Exit early (wi
1d210 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20  thout doing the 
1d220 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73  time-consuming s
1d230 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63  qlite3OsSync() c
1d240 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20  alls).    ** if 
1d250 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
1d260 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  no changes to th
1d270 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1d280 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1d290 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1d2a0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
1d2b0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1d2c0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  k(pPager);.    r
1d2d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1d2e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d2f0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
1d300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d310 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30  erSync(pPager, 0
1d320 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
1d330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d340 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
1d350 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1d360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1d370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1d380 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
1d390 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
1d3a0 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
1d3b0 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
1d3c0 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
1d3d0 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
1d3e0 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
1d3f0 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
1d400 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
1d410 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
1d420 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1d430 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
1d440 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1d450 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
1d460 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
1d470 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
1d480 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54   protocol (SQLIT
1d490 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75  E_PROTOCOL) or u
1d4a0 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1d4b0 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
1d4c0 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
1d4d0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1d4e0 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
1d4f0 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
1d500 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
1d510 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
1d520 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
1d530 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
1d540 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
1d550 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
1d560 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
1d570 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
1d580 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1d590 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1d5a0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
1d5b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1d5c0 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28  nt rc;.  TRACE2(
1d5d0 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
1d5e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d5f0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1d600 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1d610 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
1d620 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
1d630 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
1d640 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1d650 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1d660 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
1d670 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
1d680 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
1d690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1d6a0 3e 69 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  >inJournal==0 );
1d6b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d6c0 20 70 2d 3e 69 6e 53 74 6d 74 3d 3d 30 20 29 3b   p->inStmt==0 );
1d6d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d6e0 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1d6f0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1d700 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
1d710 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1d720 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
1d730 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
1d740 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
1d750 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
1d760 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
1d770 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
1d780 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1d790 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1d7a0 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
1d7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1d7c0 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
1d7d0 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
1d7e0 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
1d7f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ize);.        TR
1d800 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50  ACE3("ROLLBACK-P
1d810 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  AGE %d of %d\n",
1d820 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
1d830 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1d840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d850 20 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64   TRACE3("PAGE %d
1d860 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
1d870 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
1d880 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1d890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
1d8a0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
1d8b0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
1d8c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
1d8d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
1d8e0 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20      p->inStmt = 
1d8f0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  0;.      p->pPre
1d900 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74  vStmt = p->pNext
1d910 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1d920 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
1d930 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
1d940 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1d950 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61  er(p, pPager->pa
1d960 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
1d970 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
1d980 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
1d990 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
1d9a0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1d9b0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
1d9c0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20  r->origDbSize;. 
1d9d0 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
1d9e0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
1d9f0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1da00 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1da10 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1da20 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
1da30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1da40 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
1da50 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
1da60 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1da70 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
1da80 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
1da90 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1daa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1dab0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1dac0 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
1dad0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
1dae0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
1daf0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1db00 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1db10 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
1db20 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
1db30 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  0);.    }.    re
1db40 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1db50 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
1db60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1db70 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
1db80 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
1db90 20 20 2f 2a 20 72 63 20 3d 20 70 61 67 65 72 5f    /* rc = pager_
1dba0 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
1dbb0 67 65 72 29 3b 20 2a 2f 0a 20 20 20 20 72 63 20  ger); */.    rc 
1dbc0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1dbd0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
1dbe0 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77   rc2 = pager_unw
1dbf0 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
1dc00 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1dc10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dc20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
1dc30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1dc40 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1dc50 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
1dc60 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
1dc70 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49  ze = -1;..  /* I
1dc80 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1dc90 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
1dca0 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
1dcb0 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
1dcc0 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65  pager.  ** cache
1dcd0 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
1dce0 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
1dcf0 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
1dd00 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70  ny error .  ** p
1dd10 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  ersistent..  */.
1dd20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
1dd30 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
1dd40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1dd50 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
1dd60 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
1dd70 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
1dd80 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
1dd90 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
1dda0 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
1ddb0 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
1ddc0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
1ddd0 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
1dde0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1ddf0 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
1de00 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
1de10 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1de20 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
1de30 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
1de40 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
1de50 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  fcount(Pager *pP
1de60 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1de70 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a  pPager->nRef;.}.
1de80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1de90 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
1dea0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1deb0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
1dec0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
1ded0 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
1dee0 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
1def0 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
1df00 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
1df10 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
1df20 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
1df30 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
1df40 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
1df50 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
1df60 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
1df70 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
1df80 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
1df90 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1dfa0 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
1dfb0 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
1dfc0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
1dfd0 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[8] = pPager->n
1dfe0 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70  Ovfl;.  a[9] = p
1dff0 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
1e000 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
1e010 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
1e020 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
1e030 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
1e040 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
1e050 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
1e060 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1e070 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
1e080 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1e090 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
1e0a0 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
1e0b0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1e0c0 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
1e0d0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1e0e0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
1e0f0 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
1e100 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
1e110 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
1e120 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
1e130 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
1e140 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
1e150 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1e160 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1e170 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
1e180 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e190 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
1e1a0 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72  HARED );.  asser
1e1b0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
1e1c0 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32  e>=0 );.  TRACE2
1e1d0 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
1e1e0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1e1f0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1e200 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
1e210 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1e220 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1e230 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1e240 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
1e250 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1e260 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1e270 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
1e280 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
1e290 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
1e2a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e2b0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1e2c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1e2d0 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72  Open );.  pPager
1e2e0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->aInStmt = sqli
1e2f0 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
1e300 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
1e310 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1e320 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  aInStmt==0 ){.  
1e330 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f    /* sqlite3OsLo
1e340 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
1e350 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a  HARED_LOCK); */.
1e360 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e370 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66  E_NOMEM;.  }.#if
1e380 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63  ndef NDEBUG.  rc
1e390 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1e3a0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1e3b0 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  , &pPager->stmtJ
1e3c0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
1e3d0 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
1e3e0 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  n_failed;.  asse
1e3f0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
1e400 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d  JSize == pPager-
1e410 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23  >journalOff );.#
1e420 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e  endif.  pPager->
1e430 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67  stmtJSize = pPag
1e440 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
1e450 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
1e460 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1e470 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ize;.  pPager->s
1e480 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20  tmtHdrOff = 0;. 
1e490 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
1e4a0 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
1e4b0 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70  umInit;.  if( !p
1e4c0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
1e4d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1e4e0 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
1e4f0 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  (&pPager->stfd);
1e500 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
1e510 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
1e520 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72  iled;.    pPager
1e530 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a  ->stmtOpen = 1;.
1e540 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1e550 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NRec = 0;.  }.  
1e560 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1e570 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
1e580 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d  SQLITE_OK;. .stm
1e590 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
1e5a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
1e5b0 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  nStmt ){.    sql
1e5c0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
1e5d0 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  aInStmt);.    pP
1e5e0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
1e5f0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1e600 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
1e610 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  mit a statement.
1e620 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1e630 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50  agerStmtCommit(P
1e640 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e650 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1e660 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67  tInUse ){.    Pg
1e670 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
1e680 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54  ;.    TRACE2("ST
1e690 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  MT-COMMIT %d\n",
1e6a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e6b0 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  );.    if( !MEMD
1e6c0 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B ){.      sqlit
1e6d0 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
1e6e0 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  >stfd, 0);.     
1e6f0 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75   /* sqlite3OsTru
1e700 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74  ncate(pPager->st
1e710 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
1e720 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
1e730 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a  ger->aInStmt );.
1e740 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1e750 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
1e760 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
1e770 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
1e780 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
1e790 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
1e7a0 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
1e7b0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1e7c0 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
1e7d0 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
1e7e0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
1e7f0 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
1e800 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1e810 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1e820 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1e830 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1e840 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1e850 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
1e860 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
1e870 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48  tmt);.        pH
1e880 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
1e890 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e8a0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1e8b0 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
1e8c0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1e8d0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1e8e0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
1e8f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1e900 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
1e910 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e920 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1e930 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
1e940 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1e950 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
1e960 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1e970 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61  nt rc;.  if( pPa
1e980 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1e990 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54  {.    TRACE2("ST
1e9a0 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  MT-ROLLBACK %d\n
1e9b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1e9c0 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  r));.    if( MEM
1e9d0 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  DB ){.      PgHd
1e9e0 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f  r *pPg;.      fo
1e9f0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
1ea00 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  tmt; pPg; pPg=pP
1ea10 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20  g->pNextStmt){. 
1ea20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
1ea30 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1ea40 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1ea50 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
1ea60 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
1ea70 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
1ea80 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
1ea90 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53  (pPg), pHist->pS
1eaa0 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  tmt, pPager->pag
1eab0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1eac0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
1ead0 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
1eae0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1eaf0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
1eb00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1eb10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1eb20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
1eb30 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54  e;.      memoryT
1eb40 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
1eb50 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1eb60 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1eb70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1eb80 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
1eb90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1eba0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ebb0 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
1ebc0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1ebd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ebe0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
1ebf0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
1ec00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ec10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1ec20 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
1ec30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ec40 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
1ec50 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
1ec60 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  rFilename(Pager 
1ec70 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1ec80 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
1ec90 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
1eca0 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74  eturn the direct
1ecb0 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  ory of the datab
1ecc0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
1ecd0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1ece0 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67  PagerDirname(Pag
1ecf0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1ed00 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44  eturn pPager->zD
1ed10 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a  irectory;.}../*.
1ed20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
1ed30 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1ed40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1ed50 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1ed60 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
1ed70 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
1ed80 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1ed90 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1eda0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
1edb0 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63  rn true if fsync
1edc0 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73  () calls are dis
1edd0 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70  abled for this p
1ede0 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ager.  Return FA
1edf0 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28  LSE.** if fsync(
1ee00 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20  )s are executed 
1ee10 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  normally..*/.int
1ee20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
1ee30 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
1ee40 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1ee50 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
1ee60 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
1ee70 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
1ee80 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
1ee90 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
1eea0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1eeb0 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
1eec0 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
1eed0 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
1eee0 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
1eef0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
1ef00 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
1ef10 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
1ef20 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f   pCodecArg;.}../
1ef30 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ef40 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
1ef50 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
1ef60 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
1ef70 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
1ef80 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
1ef90 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
1efa0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1efb0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1efc0 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
1efd0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
1efe0 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
1eff0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1f000 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1f010 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
1f020 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
1f030 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
1f040 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1f050 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
1f060 64 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  dr);.  if( rc!=S
1f070 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1f080 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
1f090 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f0a0 50 67 48 64 72 29 3b 0a 20 20 69 66 28 20 72 63  PgHdr);.  if( rc
1f0b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f0c0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52  turn rc;..  /* R
1f0d0 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ead the current 
1f0e0 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34  value at byte 24
1f0f0 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f  . */.  change_co
1f100 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65  unter = retrieve
1f110 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32  32bits(pPgHdr, 2
1f120 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  4);..  /* Increm
1f130 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1f140 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1f150 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1f160 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1f170 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 70  e_counter++;.  p
1f180 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1f190 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
1f1a0 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e  PgHdr))+24, chan
1f1b0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1f1c0 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f  Pager->iChangeCo
1f1d0 75 6e 74 20 3d 20 63 68 61 6e 67 65 5f 63 6f 75  unt = change_cou
1f1e0 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  nter;..  /* Rele
1f1f0 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
1f200 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c  erence. */.  sql
1f210 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1f220 50 67 48 64 72 29 3b 0a 20 20 70 50 61 67 65 72  PgHdr);.  pPager
1f230 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1f240 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
1f250 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1f260 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
1f270 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1f280 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
1f290 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1f2a0 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
1f2b0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1f2c0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1f2d0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1f2e0 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
1f2f0 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
1f300 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
1f310 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
1f320 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1f330 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
1f340 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
1f350 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1f360 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
1f370 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
1f380 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1f390 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
1f3a0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
1f3b0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
1f3c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1f3d0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
1f3e0 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
1f3f0 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
1f400 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
1f410 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1f420 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
1f430 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
1f440 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
1f450 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1f460 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
1f470 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
1f480 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
1f490 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
1f4a0 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
1f4b0 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
1f4c0 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
1f4d0 61 67 65 72 53 79 6e 63 28 29 20 63 61 6c 6c 2e  agerSync() call.
1f4e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1f4f0 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f  ter nTrunc is no
1f500 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
1f510 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74   pager file is t
1f520 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e  runcated to.** n
1f530 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69  Trunc pages (thi
1f540 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74  s is used by aut
1f550 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1f560 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es)..*/.int sqli
1f570 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67  te3PagerSync(Pag
1f580 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
1f590 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
1f5a0 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20   Pgno nTrunc){. 
1f5b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f5c0 5f 4f 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28 22  _OK;..  TRACE4("
1f5d0 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
1f5e0 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
1f5f0 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20  s nTrunc=%d\n", 
1f600 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
1f610 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
1f620 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f  r, nTrunc);..  /
1f630 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1f640 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
1f650 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
1f660 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
1f670 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
1f680 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
1f690 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
1f6a0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
1f6b0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1f6c0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
1f6d0 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26  NCED && !MEMDB &
1f6e0 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  & pPager->dirtyC
1f6f0 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64  ache ){.    PgHd
1f700 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65  r *pPg;.    asse
1f710 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1f720 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
1f730 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
1f740 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1f750 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1f760 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1f770 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
1f780 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
1f790 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
1f7a0 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1f7b0 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
1f7c0 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
1f7d0 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
1f7e0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
1f7f0 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
1f800 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
1f810 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
1f820 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
1f830 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
1f840 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
1f850 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
1f860 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
1f870 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1f880 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
1f890 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
1f8a0 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
1f8b0 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
1f8c0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
1f8d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1f8e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f8f0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1f900 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f910 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f920 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63        if( nTrunc
1f930 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
1f940 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
1f950 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
1f960 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
1f970 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
1f980 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ges.        ** b
1f990 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
1f9a0 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
1f9b0 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
1f9c0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
1f9d0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
1f9e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1f9f0 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20      Pgno i;.    
1fa00 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20      int iSkip = 
1fa10 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1fa20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ager);.        f
1fa30 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
1fa40 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
1fa50 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
1fa60 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50          if( !(pP
1fa70 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1fa80 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37  [i/8] & (1<<(i&7
1fa90 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20  ))) && i!=iSkip 
1faa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1fab0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fac0 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
1fad0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
1fae0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1faf0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fb00 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1fb10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1fb20 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
1fb30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1fb40 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1fb50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1fb60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fb70 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1fb80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1fb90 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
1fba0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
1fbb0 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
1fbc0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
1fbd0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
1fbe0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fbf0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1fc00 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  t;.      rc = sy
1fc10 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1fc20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fc30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fc40 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1fc50 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1fc60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1fc70 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
1fc80 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
1fc90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
1fca0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1fcb0 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69  nTrunc);.      i
1fcc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fcd0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1fce0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
1fcf0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
1fd00 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
1fd10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fd20 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
1fd30 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
1fd40 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
1fd50 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1fd60 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
1fd70 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
1fd80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fd90 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
1fda0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
1fdb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
1fdc0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
1fdd0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
1fde0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1fdf0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
1fe00 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1fe10 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
1fe20 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1fe30 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
1fe40 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
1fe50 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
1fe60 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
1fe70 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
1fe80 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1fe90 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
1fea0 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  nc);.  }..sync_e
1feb0 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  xit:.  return rc
1fec0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1fed0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1fee0 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
1fef0 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
1ff00 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c  ed by pData to l
1ff10 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
1ff20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  the file. .**.**
1ff30 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
1ff40 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
1ff50 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1ff60 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e   pgno. If curren
1ff70 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69  t page.** pgno i
1ff80 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
1ff90 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1ffa0 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
1ffb0 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20 62   written there b
1ffc0 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75  y.** by this rou
1ffd0 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61  tine. The same a
1ffe0 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61  pplies to the pa
1fff0 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73 20  ge pData refers 
20000 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a  to on entry to.*
20010 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
20020 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
20030 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65 66   to the page ref
20040 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74 61  ered to by pData
20050 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
20060 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
20070 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
20080 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70 44  ted with page pD
20090 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73  ata (i.e. data s
200a0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
200b0 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
200c0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
200d0 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
200e0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
200f0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
20100 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
20110 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
20120 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
20130 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
20140 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
20150 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
20160 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
20170 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
20180 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
20190 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
201a0 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
201b0 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
201c0 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
201d0 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
201e0 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
201f0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
20200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20210 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
20220 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
20230 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
20240 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
20250 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20  Old; .  int h;. 
20260 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
20270 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
20280 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
20290 3b 0a 0a 20 20 54 52 41 43 45 35 28 22 4d 4f 56  ;..  TRACE5("MOV
202a0 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
202b0 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
202c0 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
202d0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
202e0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
202f0 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e  g->needSync, pgn
20300 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  o);.  IOTRACE(("
20310 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
20320 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
20330 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 69  gno, pgno))..  i
20340 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
20350 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
20360 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
20370 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
20380 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  g->inJournal );.
20390 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
203a0 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73  >dirty );.    as
203b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
203c0 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20  edSync );.  }.. 
203d0 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66   /* Unlink pPg f
203e0 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68  rom it's hash-ch
203f0 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ain */.  unlinkH
20400 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
20410 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   pPg);..  /* If 
20420 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
20430 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
20440 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
20450 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
20460 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
20470 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
20480 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
20490 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
204a0 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
204b0 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
204c0 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
204d0 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
204e0 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
204f0 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
20500 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64  e..  */.  pPgOld
20510 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
20520 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
20530 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
20540 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c     assert( pPgOl
20550 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20  d->nRef==0 );.  
20560 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
20570 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64  n(pPager, pPgOld
20580 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
20590 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66  (pPgOld);.    if
205a0 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79  ( pPgOld->needSy
205b0 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
205c0 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f  rt( pPgOld->inJo
205d0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70  urnal );.      p
205e0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
205f0 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  1;.      pPg->ne
20600 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
20610 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20620 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
20630 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
20640 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75  ange the page nu
20650 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64  mber for pPg and
20660 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
20670 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61  the new hash-cha
20680 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  in. */.  assert(
20690 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50   pgno!=0 );.  pP
206a0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
206b0 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50    h = pgno & (pP
206c0 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
206d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
206e0 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
206f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
20700 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
20710 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
20720 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
20730 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
20740 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
20750 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
20760 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
20770 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
20780 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
20790 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44  sh = 0;..  makeD
207a0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
207b0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
207c0 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
207d0 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
207e0 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
207f0 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
20800 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
20810 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
20820 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
20830 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
20840 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
20850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
20860 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
20870 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
20880 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
20890 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
208a0 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
208b0 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
208c0 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  aInJournal bit h
208d0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
208e0 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
208f0 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
20900 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
20910 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
20920 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
20930 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
20940 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
20950 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
20960 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
20970 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
20980 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
20990 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
209a0 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
209b0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
209c0 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
209d0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
209e0 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
209f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
20a00 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
20a10 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
20a20 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
20a30 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
20a40 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
20a50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20a60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20a70 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
20a80 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48  nc = 1;.    pPgH
20a90 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  dr->needSync = 1
20aa0 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e  ;.    pPgHdr->in
20ab0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
20ac0 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64   makeDirty(pPgHd
20ad0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
20ae0 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
20af0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
20b00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
20b10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
20b20 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
20b30 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
20b40 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
20b50 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
20b60 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62  3PagerGetData(Db
20b70 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
20b80 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
20b90 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
20ba0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
20bb0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
20bc0 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
20bd0 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
20be0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
20bf0 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
20c00 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
20c10 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
20c20 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
20c30 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
20c40 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
20c50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
20c60 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f  pPager?PGHDR_TO_
20c70 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
20c80 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r):0);.}../*.** 
20c90 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
20ca0 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
20cb0 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
20cc0 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
20cd0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
20ce0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
20cf0 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
20d00 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
20d10 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
20d20 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
20d30 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
20d40 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
20d50 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
20d60 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
20d70 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
20d80 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
20d90 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
20da0 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
20db0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
20dc0 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
20dd0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
20de0 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
20df0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
20e00 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
20e10 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
20e20 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
20e30 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
20e40 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
20e50 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 69   int eMode){.  i
20e60 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20  f( eMode>=0 ){. 
20e70 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
20e80 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65  siveMode = eMode
20e90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
20ea0 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c  int)pPager->excl
20eb0 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69  usiveMode;.}..#i
20ec0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
20ed0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
20ee0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
20ef0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
20f00 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
20f10 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20  f the file lock 
20f20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
20f30 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ger..** The retu
20f40 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20  rn value is one 
20f50 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52  of NO_LOCK, SHAR
20f60 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
20f70 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49  D_LOCK,.** PENDI
20f80 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c  NG_LOCK, or EXCL
20f90 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69  USIVE_LOCK..*/.i
20fa0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
20fb0 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a  ockstate(Pager *
20fc0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
20fd0 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53  n sqlite3OsLockS
20fe0 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29  tate(pPager->fd)
20ff0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
21000 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
21010 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
21020 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
21030 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
21040 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
21050 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
21060 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50  e3PagerRefdump(P
21070 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21080 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
21090 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
210a0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
210b0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
210c0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
210d0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
210e0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
210f0 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
21100 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
21110 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
21120 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
21130 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
21140 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
21150 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
21160 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
21170 4f 20 2a 2f 0a                                   O */.