/ Hex Artifact Content
Login

Artifact c276e9de4e77d1c3d72367a7e207fa82e0e74af3:


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: 30 20 32 30 30 37 2f 30 33 2f 31 39 20 31 31 3a  0 2007/03/19 11:
0360: 32 35 3a 32 30 20 64 61 6e 69 65 6c 6b 31 39 37  25:20 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 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
0de0: 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74  occurs, the stat
0df0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0e00: 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a   PAGER_SHARED..*
0e10: 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65  * After all page
0e20: 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65  s have been rele
0e30: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
0e40: 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a  e_page_unref(),.
0e50: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61  ** the state tra
0e60: 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f  nsitions back to
0e70: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0e80: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a  The first time.*
0e90: 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 70 61  * that sqlite3pa
0ea0: 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63  ger_write() is c
0eb0: 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65  alled, the state
0ec0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a   transitions to.
0ed0: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0ee0: 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  D.  (Note that s
0ef0: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0f00: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0f10: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
0f20: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
0f30: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
0f40: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
0f50: 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53  ** be in PAGER_S
0f60: 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20  HARED before it 
0f70: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0f80: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a  AGER_RESERVED.).
0f90: 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f  ** The transitio
0fa0: 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  n to PAGER_EXCLU
0fb0: 53 49 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e  SIVE occurs when
0fc0: 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
0fd0: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
0fe0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ff0: 66 69 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20  file.  After an 
1000: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
1010: 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71  lback().** or sq
1020: 6c 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69  lite_pager_commi
1030: 74 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 67  t(), the state g
1040: 6f 65 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  oes back to PAGE
1050: 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65  R_SHARED..*/.#de
1060: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
1070: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1080: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
1090: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
10a0: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
10b0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
10c0: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
10d0: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
10e0: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
10f0: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1100: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1110: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
1120: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1130: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
1140: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
1150: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1160: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
1170: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1180: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
1190: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
11a0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
11b0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
11c0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
11d0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
11e0: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
11f0: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1200: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1210: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
1220: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
1230: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
1240: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
1250: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
1260: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
1270: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1280: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
1290: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
12a0: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
12b0: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
12c0: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
12d0: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
12e0: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
12f0: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1300: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1310: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
1320: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
1330: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
1340: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
1350: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
1360: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
1370: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1380: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
1390: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
13a0: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
13b0: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
13c0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
13d0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
13e0: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
13f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1400: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1410: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
1420: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1430: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
1440: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1450: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1460: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1470: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1480: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
1490: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
14a0: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
14b0: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
14c0: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
14d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
14e0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
14f0: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1500: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1510: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1520: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1530: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1540: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1550: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1560: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1570: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1580: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
1590: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
15a0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
15b0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
15c0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
15d0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
15e0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
15f0: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e  pager_write() on
1600: 20 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f   a page prior to
1610: 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d   making.** any m
1620: 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20  odifications to 
1630: 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20  that page.  The 
1640: 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74  first time sqlit
1650: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a  e3pager_write().
1660: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ** is called, th
1670: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
1680: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69  contents are wri
1690: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f  tten into the ro
16a0: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
16b0: 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f  l and PgHdr.inJo
16c0: 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e  urnal and PgHdr.
16d0: 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73 65 74  needSync are set
16e0: 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a  .  Later, once.*
16f0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  * the journal pa
1700: 67 65 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f  ge has made it o
1710: 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72  nto the disk sur
1720: 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64  face, PgHdr.need
1730: 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72  Sync.** is clear
1740: 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65  ed.  The modifie
1750: 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  d page cannot be
1760: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
1770: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  to the original.
1780: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1790: 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e   until the journ
17a0: 61 6c 20 70 61 67 65 73 20 68 61 73 20 62 65 65  al pages has bee
17b0: 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
17c0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64   and the.** PgHd
17d0: 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62  r.needSync has b
17e0: 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  een cleared..**.
17f0: 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69 72  ** The PgHdr.dir
1800: 74 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  ty flag is set w
1810: 68 65 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72  hen sqlite3pager
1820: 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  _write() is call
1830: 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65  ed and.** is cle
1840: 61 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20  ared again when 
1850: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1860: 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b   is written back
1870: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
1880: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1890: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
18a0: 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72  ruct PgHdr PgHdr
18b0: 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b  ;.struct PgHdr {
18c0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
18d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18e0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
18f0: 6f 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67  o which this pag
1900: 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50  e belongs */.  P
1910: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1930: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1940: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
1950: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1960: 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68  Hash, *pPrevHash
1970: 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69  ;  /* Hash colli
1980: 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50  sion chain for P
1990: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50  gHdr.pgno */.  P
19a0: 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c  gHdr *pNextFree,
19b0: 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a   *pPrevFree;  /*
19c0: 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67   Freelist of pag
19d0: 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
19e0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19f0: 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  xtAll;          
1a00: 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f       /* A list o
1a10: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
1a20: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d   PgHdr *pNextStm
1a30: 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20  t, *pPrevStmt;  
1a40: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
1a50: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
1a60: 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  t journal */.  u
1a70: 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  8 inJournal;    
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a90: 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65   TRUE if has bee
1aa0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  n written to jou
1ab0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53  rnal */.  u8 inS
1ac0: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
1ae0: 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65   if in the state
1af0: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
1b00: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20  */.  u8 dirty;  
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77      /* TRUE if w
1b30: 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  e need to write 
1b40: 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a  back changes */.
1b50: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c   /* Sync journal
1b80: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
1b90: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
1ba0: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
1bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1bc0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
1bd0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69  llback() for thi
1be0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72  s page */.  shor
1bf0: 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20  t int nRef;     
1c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c10: 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66  mber of users of
1c20: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1c30: 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20 2a  PgHdr *pDirty, *
1c40: 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20 2f  pPrevDirty;    /
1c50: 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a 2f  * Dirty pages */
1c60: 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 20  .  u32 notUsed; 
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61 63    /* Buffer spac
1c90: 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e */.#ifdef SQLI
1ca0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1cb0: 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23   u32 pageHash;.#
1cc0: 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65  endif.  /* pPage
1cd0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1ce0: 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66  s of page data f
1cf0: 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65  ollow this heade
1d00: 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e  r */.  /* Pager.
1d10: 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
1d20: 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f  local data follo
1d30: 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  w the page data 
1d40: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
1d50: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
1d60: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
1d70: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
1d80: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
1d90: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
1da0: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
1db0: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
1dc0: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
1dd0: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
1de0: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
1df0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
1e00: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1e10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
1e20: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
1e30: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
1e40: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
1e50: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
1e70: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
1e80: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
1e90: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
1ea0: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
1eb0: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
1ec0: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
1ed0: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
1ee0: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
1ef0: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
1f00: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
1f10: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
1f20: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
1f30: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
1f40: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
1f50: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
1f60: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
1f70: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
1f80: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
1f90: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
1fa0: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
1fb0: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
1fc0: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
1fd0: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
1fe0: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
1ff0: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
2000: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
2010: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
2020: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
2030: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
2040: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
2050: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
2060: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
2070: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
2080: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
2090: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
20a0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
20b0: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
20c0: 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f  ,N,X) if( P->xCo
20d0: 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f  dec!=0 ){ P->xCo
20e0: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
20f0: 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66  ,D,N,X); }.# def
2100: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
2110: 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e  ,X) ((char*)(P->
2120: 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f  xCodec!=0?P->xCo
2130: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
2140: 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73  ,D,N,X):D)).#els
2150: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
2160: 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f  1(P,D,N,X) /* NO
2170: 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  -OP */.# define 
2180: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
2190: 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69  ((char*)D).#endi
21a0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
21b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
21c0: 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69  PgHdr into a poi
21d0: 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61  nter to its data
21e0: 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61  .** and back aga
21f0: 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  in..*/.#define P
2200: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20  GHDR_TO_DATA(P) 
2210: 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31   ((void*)(&(P)[1
2220: 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41  ])).#define DATA
2230: 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26  _TO_PGHDR(D)  (&
2240: 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31  ((PgHdr*)(D))[-1
2250: 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  ]).#define PGHDR
2260: 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28  _TO_EXTRA(G,P) (
2270: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
2280: 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e  (&(G)[1]))[(P)->
2290: 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66 69  pageSize]).#defi
22a0: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ne PGHDR_TO_HIST
22b0: 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20  (P,PGR)  \.     
22c0: 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f         ((PgHisto
22d0: 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  ry*)&((char*)(&(
22e0: 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70  P)[1]))[(PGR)->p
22f0: 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e  ageSize+(PGR)->n
2300: 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41  Extra])../*.** A
2310: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
2320: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
2330: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2340: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
2350: 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  * Pager.errCode 
2360: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51  may be set to SQ
2370: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
2380: 54 45 5f 43 4f 52 52 55 50 54 2c 20 53 51 4c 49  TE_CORRUPT, SQLI
2390: 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 2a 2a 20 6f  TE_PROTOCOL.** o
23a0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f  r SQLITE_FULL. O
23b0: 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  nce one of the f
23c0: 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72  irst three error
23d0: 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72  s occurs, it per
23e0: 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20  sists.** and is 
23f0: 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20  returned as the 
2400: 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20  result of every 
2410: 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20  major pager API 
2420: 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  call.  The.** SQ
2430: 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e  LITE_FULL return
2440: 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c   code is slightl
2450: 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20  y different. It 
2460: 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e  persists only un
2470: 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20  til the.** next 
2480: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
2490: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
24a0: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
24b0: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51  che. Also,.** SQ
24c0: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
24d0: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
24e0: 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
24f0: 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65   and sqlite3page
2500: 72 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50  r_lookup().** AP
2510: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
2520: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
2530: 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75  ssfully..*/.stru
2540: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 75 38 20  ct Pager {.  u8 
2550: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20  journalOpen;    
2560: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2570: 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
2580: 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20   descriptors is 
2590: 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f  valid */.  u8 jo
25a0: 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20  urnalStarted;   
25b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25c0: 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72  f header of jour
25d0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  nal is synced */
25e0: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
25f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2600: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
2610: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
2620: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
2630: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
2640: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
2650: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
2660: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
2670: 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20   u8 stmtOpen;   
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2690: 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74  True if the stat
26a0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
26b0: 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38   is open */.  u8
26c0: 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20   stmtInUse;     
26d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
26e0: 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74  e we are in a st
26f0: 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
2700: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73  action */.  u8 s
2710: 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20  tmtAutoopen;    
2720: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2730: 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65  stmt journal whe
2740: 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  n main journal i
2750: 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20  s opened*/.  u8 
2760: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
2770: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2780: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
2790: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
27a0: 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20   u8 fullSync;   
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27c0: 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f  Do extra syncs o
27d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  f the journal fo
27e0: 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a  r robustness */.
27f0: 20 20 75 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b    u8 full_fsync;
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2810: 20 55 73 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   Use F_FULLFSYNC
2820: 20 77 68 65 6e 20 61 76 61 69 6c 61 62 6c 65 20   when available 
2830: 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20  */.  u8 state;  
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   /* PAGER_UNLOCK
2860: 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45  , _SHARED, _RESE
2870: 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20  RVED, etc. */.  
2880: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
2890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
28a0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
28b0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
28c0: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28e0: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
28f0: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
2900: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73  /* True if an fs
2930: 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20  ync() is needed 
2940: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  on the journal *
2950: 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68  /.  u8 dirtyCach
2960: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2970: 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
2980: 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61  d pages have cha
2990: 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77  nged */.  u8 alw
29a0: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
29b0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
29c0: 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
29d0: 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a   for all pages *
29e0: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
2a10: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
2a20: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
2a30: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2a40: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
2a50: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
2a60: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
2a70: 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65  */.  int errCode
2a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a90: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
2aa0: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
2ab0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69  rs */.  int dbSi
2ac0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2ad0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ae0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
2af0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67  le */.  int orig
2b00: 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  DbSize;         
2b10: 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65      /* dbSize be
2b20: 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
2b30: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74   change */.  int
2b40: 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20   stmtSize;      
2b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2b60: 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e   of database (in
2b70: 20 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f   pages) at stmt_
2b80: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
2b90: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
2ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2bb0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
2bc0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2bd0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
2be0: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
2bf0: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
2c00: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
2c10: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
2c20: 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e  m */.  int stmtN
2c30: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
2c40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c50: 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20  records in stmt 
2c60: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
2c70: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2c90: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
2ca0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
2cb0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2cc0: 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20  nt pageSize;    
2cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ce0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2cf0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
2d00: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2d20: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  l number of in-m
2d30: 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20  emory pages */. 
2d40: 20 69 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20   int nMaxPage;  
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d60: 48 69 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20  High water mark 
2d70: 6f 66 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e  of nPage */.  in
2d80: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
2d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2da0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2db0: 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64   pages with PgHd
2dc0: 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e  r.nRef>0 */.  in
2dd0: 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20  t mxPage;       
2de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2df0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
2e00: 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20  ages to hold in 
2e10: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61  cache */.  u8 *a
2e20: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
2e30: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
2e40: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
2e50: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2e60: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  file */.  u8 *aI
2e70: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
2e80: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2e90: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2ea0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
2eb0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
2ec0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2ed0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2ee0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2ef0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f10: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
2f20: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
2f30: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
2f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2f50: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
2f60: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
2f70: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46  l files */.  OsF
2f80: 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20  ile *fd, *jfd;  
2f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2fa0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
2fb0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
2fc0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c  urnal */.  OsFil
2fd0: 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20  e *stfd;        
2fe0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2ff0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
3000: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
3010: 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48  ournal*/.  BusyH
3020: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
3030: 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  dler;  /* Pointe
3040: 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79  r to sqlite.busy
3050: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48  Handler */.  PgH
3060: 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61  dr *pFirst, *pLa
3070: 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
3080: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a   of free pages *
3090: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
30a0: 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  tSynced;        
30b0: 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61  /* First free pa
30c0: 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65  ge with PgHdr.ne
30d0: 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50  edSync==0 */.  P
30e0: 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20  gHdr *pAll;     
30f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
3100: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
3110: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d  */.  PgHdr *pStm
3120: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3130: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
3140: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
3150: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  nt subjournal */
3160: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
3170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3180: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69  * List of all di
3190: 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  rty pages */.  i
31a0: 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20  64 journalOff;  
31b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
31c0: 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65  rrent byte offse
31d0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
31e0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
31f0: 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20  ournalHdr;      
3200: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
3210: 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75  ffset to previou
3220: 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  s journal header
3230: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64   */.  i64 stmtHd
3240: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
3250: 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e    /* First journ
3260: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
3270: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
3280: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b   */.  i64 stmtCk
3290: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
32a0: 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77    /* cksumInit w
32b0: 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61  hen statement wa
32c0: 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  s started */.  i
32d0: 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20  64 stmtJSize;   
32e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
32f0: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74  ze of journal at
3300: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
3310: 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a  .  int sectorSiz
3320: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
3330: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
3340: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
3350: 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20  lback */.#ifdef 
3360: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
3370: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e  t nHit, nMiss, n
3380: 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63  Ovfl;     /* Cac
3390: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67  he hits, missing
33a0: 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c  , and LRU overfl
33b0: 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ows */.  int nRe
33c0: 61 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20  ad,nWrite;      
33d0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
33e0: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
33f0: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
3400: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74  void (*xDestruct
3410: 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20  or)(void*,int); 
3420: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
3430: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
3440: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
3450: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76  d (*xReiniter)(v
3460: 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20  oid*,int);   /* 
3470: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
3480: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
3490: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
34a0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
34b0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
34c0: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
34d0: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
34e0: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
34f0: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
3500: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
3510: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
3520: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 61 73 68  ) */.  int nHash
3530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3540: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
3550: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
3560: 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a  le */.  PgHdr **
3570: 61 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  aHash;          
3580: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
3590: 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75  e to map page nu
35a0: 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f  mber to PgHdr */
35b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
35c0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
35d0: 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20  AGEMENT.  Pager 
35e0: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
35f0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20        /* Linked 
3600: 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 69  list of pagers i
3610: 6e 20 74 68 69 73 20 74 68 72 65 61 64 20 2a 2f  n this thread */
3620: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
3630: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
3640: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
3650: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
3660: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
3670: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 4e 6f  se */.  int doNo
3680: 74 53 79 6e 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  tSync;.};../*.**
3690: 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   If SQLITE_TEST 
36a0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
36b0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  increment the va
36c0: 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a  riable given in.
36d0: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  ** the argument.
36e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
36f0: 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54  _TEST.# define T
3700: 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b  EST_INCR(x)  x++
3710: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3720: 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e  TEST_INCR(x).#en
3730: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  dif../*.** Journ
3740: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
3750: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
3760: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
3770: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
3780: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
3790: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
37a0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
37b0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
37c0: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
37d0: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
37e0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
37f0: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
3800: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
3810: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3820: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
3830: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
3840: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
3850: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
3860: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
3870: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
3880: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
3890: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
38a0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
38b0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
38c0: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
38d0: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
38e0: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
38f0: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
3900: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
3910: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
3920: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3930: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3940: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3950: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
3960: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3970: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3980: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
3990: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
39a0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
39b0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
39c0: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
39d0: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
39e0: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
39f0: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3a00: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3a10: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3a20: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3a30: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3a40: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3a50: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3a60: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3a70: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3a80: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3a90: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3aa0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
3ab0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
3ac0: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
3ad0: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
3ae0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
3af0: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
3b00: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3b10: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3b20: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3b30: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3b40: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3b50: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3b60: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3b70: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3b80: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3b90: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3ba0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
3bb0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
3bc0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
3bd0: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
3be0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
3bf0: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
3c00: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3c10: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3c20: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3c30: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3c40: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3c50: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3c60: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
3c70: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
3c80: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
3c90: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
3ca0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
3cb0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
3cc0: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
3cd0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
3ce0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
3cf0: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
3d00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3d10: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
3d20: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
3d30: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
3d40: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
3d50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
3d60: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
3d70: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3d80: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
3d90: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
3da0: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
3db0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
3dc0: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
3dd0: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
3de0: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
3df0: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
3e00: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
3e10: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
3e20: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3e30: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
3e40: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
3e50: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
3e60: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
3e70: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
3e80: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
3e90: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
3ea0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
3eb0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
3ec0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
3ed0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
3ee0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
3ef0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
3f00: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
3f10: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
3f20: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
3f30: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
3f40: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
3f50: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
3f60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
3f70: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
3f80: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
3f90: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
3fa0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
3fb0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  endif../*.** Pag
3fc0: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
3fd0: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
3fe0: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
3ff0: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
4000: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
4010: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
4020: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
4030: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
4040: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
4050: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
4060: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
4070: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
4080: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4090: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
40a0: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
40b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
40c0: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
40d0: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
40e0: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
40f0: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
4100: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
4110: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
4120: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
4130: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
4140: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
4150: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
4160: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
4170: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
4180: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
4190: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
41a0: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
41b0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
41c0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
41d0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
41e0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
41f0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4200: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
4210: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
4220: 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67  cking (for debug
4230: 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23  ging) here:.*/.#
4240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4250: 54 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72  T.  int pager3_r
4260: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20  efinfo_enable = 
4270: 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  0;.  static void
4280: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50   pager_refinfo(P
4290: 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74  gHdr *p){.    st
42a0: 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30  atic int cnt = 0
42b0: 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72  ;.    if( !pager
42c0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
42d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
42e0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
42f0: 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e  f(.       "REFCN
4300: 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e  T: %4d addr=%p n
4310: 52 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25  Ref=%-3d total=%
4320: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e  d\n",.       p->
4330: 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
4340: 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c  ATA(p), p->nRef,
4350: 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66   p->pPager->nRef
4360: 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b  .    );.    cnt+
4370: 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e  +;   /* Somethin
4380: 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  g to set a break
4390: 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a  point on */.  }.
43a0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
43b0: 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e  (X)  pager_refin
43c0: 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  fo(X).#else.# de
43d0: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a  fine REFINFO(X).
43e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
43f0: 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f  hange the size o
4400: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68  f the pager hash
4410: 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e 20   table to N.  N 
4420: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 0a  must be a power.
4430: 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74  ** of two..*/.st
4440: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
4450: 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c  resize_hash_tabl
4460: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
4470: 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64 72   int N){.  PgHdr
4480: 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b 0a   **aHash, *pPg;.
4490: 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 26 26    assert( N>0 &&
44a0: 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29 3b   (N&(N-1))==0 );
44b0: 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69 74  .  aHash = sqlit
44c0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
44d0: 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20  aHash[0])*N );. 
44e0: 20 69 66 28 20 61 48 61 73 68 3d 3d 30 20 29 7b   if( aHash==0 ){
44f0: 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20  .    /* Failure 
4500: 74 6f 20 72 65 68 61 73 68 20 69 73 20 6e 6f 74  to rehash is not
4510: 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 74 20 69   an error.  It i
4520: 73 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d  s only a perform
4530: 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20  ance hit. */.   
4540: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
4550: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
4560: 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67  ->aHash);.  pPag
4570: 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20  er->nHash = N;. 
4580: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d   pPager->aHash =
4590: 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 50   aHash;.  for(pP
45a0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
45b0: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
45c0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74  extAll){.    int
45d0: 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   h;.    if( pPg-
45e0: 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
45f0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
4600: 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
4610: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
4620: 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   );.      contin
4630: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 20  ue;.    }.    h 
4640: 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e  = pPg->pgno & (N
4650: 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  -1);.    pPg->pN
4660: 65 78 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b  extHash = aHash[
4670: 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73  h];.    if( aHas
4680: 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48  h[h] ){.      aH
4690: 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
46a0: 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  h = pPg;.    }. 
46b0: 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50     aHash[h] = pP
46c0: 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  g;.    pPg->pPre
46d0: 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d  vHash = 0;.  }.}
46e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
46f0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
4700: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
4710: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
4720: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
4730: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
4740: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
4750: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
4760: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
4770: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
4780: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
4790: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
47a0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
47b0: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
47c0: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
47d0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
47e0: 20 72 65 61 64 33 32 62 69 74 73 28 4f 73 46 69   read32bits(OsFi
47f0: 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65  le *fd, u32 *pRe
4800: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
4810: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
4820: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
4830: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
4840: 6f 66 28 61 63 29 29 3b 0a 20 20 69 66 28 20 72  of(ac));.  if( r
4850: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4860: 20 20 20 20 2a 70 52 65 73 20 3d 20 28 61 63 5b      *pRes = (ac[
4870: 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d  0]<<24) | (ac[1]
4880: 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c  <<16) | (ac[2]<<
4890: 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a  8) | ac[3];.  }.
48a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
48b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
48c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
48d0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
48e0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
48f0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  byte order..*/.s
4900: 74 61 74 69 63 20 76 6f 69 64 20 70 75 74 33 32  tatic void put32
4910: 62 69 74 73 28 63 68 61 72 20 2a 61 63 2c 20 75  bits(char *ac, u
4920: 33 32 20 76 61 6c 29 7b 0a 20 20 61 63 5b 30 5d  32 val){.  ac[0]
4930: 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30   = (val>>24) & 0
4940: 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28  xff;.  ac[1] = (
4950: 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b  val>>16) & 0xff;
4960: 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e  .  ac[2] = (val>
4970: 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  >8) & 0xff;.  ac
4980: 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66  [3] = val & 0xff
4990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
49a0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
49b0: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
49c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
49d0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
49e0: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
49f0: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
4a00: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
4a10: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
4a20: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
4a30: 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64  2bits(OsFile *fd
4a40: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
4a50: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
4a60: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
4a70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4a80: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
4a90: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  4);.}../*.** Rea
4aa0: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
4ab0: 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66  er at offset 'of
4ac0: 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70  fset' from the p
4ad0: 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
4ae0: 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72  y.** page header
4af0: 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   'p'..*/.static 
4b00: 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62 69  u32 retrieve32bi
4b10: 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74  ts(PgHdr *p, int
4b20: 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69   offset){.  unsi
4b30: 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20  gned char *ac;. 
4b40: 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65   ac = &((unsigne
4b50: 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  d char*)PGHDR_TO
4b60: 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74  _DATA(p))[offset
4b70: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b  ];.  return (ac[
4b80: 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d  0]<<24) | (ac[1]
4b90: 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c  <<16) | (ac[2]<<
4ba0: 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a  8) | ac[3];.}...
4bb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4bc0: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ion should be ca
4bd0: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72  lled when an err
4be0: 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
4bf0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f   the pager.** co
4c00: 64 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  de. The first ar
4c10: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
4c20: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
4c30: 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a   structure, the.
4c40: 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72  ** second the er
4c50: 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
4c60: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
4c70: 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e   a pager API fun
4c80: 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76  ction. .** The v
4c90: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
4ca0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
4cb0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
4cc0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
4cd0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
4ce0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
4cf0: 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  s SQLITE_IOERR, 
4d00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f  SQLITE_CORRUPT o
4d10: 72 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  r SQLITE_PROTOCO
4d20: 4c 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  L,.** the error 
4d30: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
4d40: 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65  nt. All subseque
4d50: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
4d60: 74 68 69 73 20 50 61 67 65 72 0a 2a 2a 20 77 69  this Pager.** wi
4d70: 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
4d80: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65  eturn the same e
4d90: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
4da0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
4db0: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
4dc0: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
4dd0: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
4de0: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ff;.  assert( pP
4df0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
4e00: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50  QLITE_FULL || pP
4e10: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
4e20: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
4e30: 28 20 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ( .    rc2==SQLI
4e40: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72  TE_FULL ||.    r
4e50: 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
4e60: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4e70: 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 0a 20  ITE_CORRUPT ||. 
4e80: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 50     rc2==SQLITE_P
4e90: 52 4f 54 4f 43 4f 4c 0a 20 20 29 7b 0a 20 20 20  ROTOCOL.  ){.   
4ea0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
4eb0: 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74   = rc;.  }.  ret
4ec0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
4ed0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
4ee0: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
4ef0: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
4f00: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
4f10: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
4f20: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
4f30: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
4f40: 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68 61  pPage){.  u32 ha
4f50: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
4f60: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4f70: 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69 67   *pData = (unsig
4f80: 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52  ned char *)PGHDR
4f90: 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 3b  _TO_DATA(pPage);
4fa0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
4fb0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
4fc0: 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
4fd0: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69 29   hash = (hash+i)
4fe0: 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20  ^pData[i];.  }. 
4ff0: 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a   return hash;.}.
5000: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
5010: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
5020: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
5030: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
5040: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
5050: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
5060: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
5070: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
5080: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
5090: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
50a0: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
50b0: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
50c0: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
50d0: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
50e0: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
50f0: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
5100: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
5110: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
5120: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
5130: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
5140: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
5150: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
5160: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
5170: 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42  errCode || MEMDB
5180: 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c   || pPg->dirty |
5190: 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  | .      pPg->pa
51a0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
51b0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
51c0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
51d0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
51e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
51f0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
5200: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5210: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
5220: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
5230: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
5240: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5250: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
5260: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
5270: 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e   and .** written
5280: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
5290: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
52a0: 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61  eMalloc(). *pzMa
52b0: 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74  ster is.** set t
52c0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d  o point at the m
52d0: 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
52e0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
52f0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
5300: 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70   sqliteFree() *p
5310: 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  zMaster..**.** I
5320: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
5330: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
5340: 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74   present *pzMast
5350: 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  er is set to 0 a
5360: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
5370: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
5380: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
5390: 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65  erJournal(OsFile
53a0: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a   *pJrnl, char **
53b0: 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  pzMaster){.  int
53c0: 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a   rc;.  u32 len;.
53d0: 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32    i64 szJ;.  u32
53e0: 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b   cksum;.  int i;
53f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5400: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
5410: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
5420: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
5430: 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72   */..  *pzMaster
5440: 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71   = 0;..  rc = sq
5450: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
5460: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20  pJrnl, &szJ);.  
5470: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5480: 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65  K || szJ<16 ) re
5490: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
54a0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
54b0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20  Jrnl, szJ-16);. 
54c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
54d0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
54e0: 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62   .  rc = read32b
54f0: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29  its(pJrnl, &len)
5500: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5510: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5520: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
5530: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b  2bits(pJrnl, &ck
5540: 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
5550: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5560: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5570: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
5580: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a  nl, aMagic, 8);.
5590: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
55a0: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
55b0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
55c0: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
55d0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
55e0: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
55f0: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20  , szJ-16-len);. 
5600: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5610: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5620: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28  .  *pzMaster = (
5630: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
5640: 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66  loc(len+1);.  if
5650: 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a  ( !*pzMaster ){.
5660: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5670: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
5680: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5690: 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74  d(pJrnl, *pzMast
56a0: 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  er, len);.  if( 
56b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
56c0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
56d0: 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  *pzMaster);.    
56e0: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  *pzMaster = 0;. 
56f0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5700: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
5710: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
5720: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
5730: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
5740: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
5750: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
5760: 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b   -= (*pzMaster)[
5770: 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  i];.  }.  if( ck
5780: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
5790: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
57a0: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
57b0: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
57c0: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
57d0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
57e0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
57f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
5800: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
5810: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
5820: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
5830: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
5840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5850: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
5860: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
5870: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
5880: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
5890: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
58a0: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
58b0: 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  er = 0;.  }else{
58c0: 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29  .    (*pzMaster)
58d0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
58e0: 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  }.   .  return S
58f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5900: 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  ** Seek the jour
5910: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
5920: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
5930: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
5940: 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e  where a.** journ
5950: 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65  al header may be
5960: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
5970: 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  . Pager.journalO
5980: 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ff is updated wi
5990: 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65  th.** the new se
59a0: 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a  ek offset..**.**
59b0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
59c0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
59d0: 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65  *.** Input Offse
59e0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  t              O
59f0: 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20  utput Offset.** 
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a20: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20  -------.** 0    
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20       0.** 512   
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20      512.** 100  
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a80: 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30       512.** 2000
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
5ab0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
5ac0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  kJournalHdr(Page
5ad0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
5ae0: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
5af0: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
5b00: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
5b10: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
5b20: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
5b30: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5b40: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
5b50: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5b60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
5b70: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
5b80: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
5b90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
5ba0: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
5bb0: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
5bc0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5bd0: 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65  ager) );.  pPage
5be0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
5bf0: 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  offset;.  return
5c00: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
5c10: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5c20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
5c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
5c40: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
5c50: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
5c60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5c70: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
5c80: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
5c90: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
5ca0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5cb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5cc0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
5cd0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
5ce0: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
5cf0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
5d00: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
5d10: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
5d20: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
5d30: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
5d40: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
5d50: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
5d60: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
5d70: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
5d80: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
5d90: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
5da0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
5db0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
5dc0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
5dd0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
5de0: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
5df0: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
5e00: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
5e10: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
5e20: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a  is journal..** .
5e30: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
5e40: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
5e50: 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e   24) bytes of un
5e60: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
5e70: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
5e80: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
5e90: 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72  *pPager){.  char
5ea0: 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
5eb0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
5ec0: 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  6];.  int rc;.. 
5ed0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
5ee0: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
5ef0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
5f00: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
5f10: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a  ournalOff;.  }..
5f20: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
5f30: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
5f40: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
5f50: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
5f60: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
5f70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5f80: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
5f90: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
5fa0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5fb0: 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a  ..  /* FIX ME: .
5fc0: 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62    **.  ** Possib
5fd0: 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e  ly for a pager n
5fe0: 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ot in no-sync mo
5ff0: 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
6000: 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74  magic should not
6010: 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
6020: 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66   until nRec is f
6030: 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74  illed in as part
6040: 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75   of next syncJou
6050: 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20  rnal(). .  **.  
6060: 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62  ** Actually mayb
6070: 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  e the whole jour
6080: 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c  nal header shoul
6090: 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74  d be delayed unt
60a0: 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69  il that.  ** poi
60b0: 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  nt. Think about 
60c0: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  this..  */.  mem
60d0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
60e0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
60f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6100: 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65  ));.  /* The nRe
6110: 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46  c Field. 0xFFFFF
6120: 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20  FFF for no-sync 
6130: 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70  journals. */.  p
6140: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6150: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6160: 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
6170: 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66  ->noSync ? 0xfff
6180: 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a  fffff : 0);.  /*
6190: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
61a0: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
61b0: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
61c0: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
61d0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
61e0: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
61f0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
6200: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6210: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6220: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
6230: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6240: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
6250: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
6260: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6270: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
6280: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
6290: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
62a0: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
62b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
62c0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
62d0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
62e0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
62f0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
6300: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
6310: 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ize);.  IOTRACE(
6320: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
6330: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
6340: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
6350: 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
6360: 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ))).  rc = sqlit
6370: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6380: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
6390: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
63a0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
63b0: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
63c0: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
63d0: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
63e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
63f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6400: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
6410: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6420: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
6430: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6440: 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  K ){.    IOTRACE
6450: 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64  (("JTAIL %p %lld
6460: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
6470: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
6480: 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  1)).    rc = sql
6490: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
64a0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
64b0: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20  journalOff-1);. 
64c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
64d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
64e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
64f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  e(pPager->jfd, "
6500: 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d  \000", 1);.    }
6510: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
6530: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
6540: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
6550: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
6560: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
6570: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
6580: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
6590: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
65a0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
65b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
65c0: 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d  * file. See comm
65d0: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
65e0: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
65f0: 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63  Hdr() for a desc
6600: 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ription of.** th
6610: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6620: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
6630: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
6640: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
6650: 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20  y, *nRec is set 
6660: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
6670: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
6680: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
6690: 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69  header and *dbSi
66a0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
66b0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
66c0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
66d0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
66e0: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
66f0: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
6700: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
6710: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
6720: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6730: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
6740: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
6750: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
6760: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
6770: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6780: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
6790: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
67a0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
67b0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e   returned and *n
67c0: 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  Rec and *dbSize 
67d0: 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66  are not set.  If
67e0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
67f0: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
6800: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
6810: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
6820: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
6830: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
6840: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
6850: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
6860: 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a  pPager, .  i64 j
6870: 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33  ournalSize,.  u3
6880: 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32  2 *pNRec, .  u32
6890: 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69   *pDbSize.){.  i
68a0: 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
68b0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
68c0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
68d0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
68e0: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20  header */..  rc 
68f0: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
6900: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
6910: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6920: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
6930: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
6940: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6950: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
6960: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6970: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
6980: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
6990: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
69a0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
69b0: 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20  aMagic));.  if( 
69c0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
69d0: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
69e0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
69f0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
6a00: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ic))!=0 ){.    r
6a10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
6a20: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  E;.  }..  rc = r
6a30: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
6a40: 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20  ->jfd, pNRec);. 
6a50: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6a60: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
6a70: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6a80: 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  jfd, &pPager->ck
6a90: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
6aa0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6ab0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6ac0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6ad0: 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  pDbSize);.  if( 
6ae0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6af0: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
6b00: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
6b10: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
6b20: 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
6b30: 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73  .  ** the proces
6b40: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
6b50: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
6b60: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
6b70: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79  .  ** created by
6b80: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
6b90: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
6ba0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
6bb0: 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  e.  ** is being 
6bc0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
6bd0: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
6be0: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
6bf0: 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67  alue.  ** of Pag
6c00: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
6c10: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
6c20: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
6c30: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tine..  */.  rc 
6c40: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6c50: 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a  ger->jfd, (u32 *
6c60: 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  )&pPager->sector
6c70: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
6c80: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6c90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6ca0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
6cb0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
6cc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
6cd0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
6ce0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6cf0: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
6d00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
6d10: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
6d20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6d30: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
6d40: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
6d50: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
6d60: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6d70: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
6d80: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
6d90: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
6da0: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
6db0: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
6dc0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
6dd0: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
6de0: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
6df0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
6e00: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
6e10: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
6e20: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
6e30: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
6e40: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
6e50: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
6e60: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
6e70: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
6e80: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
6e90: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
6ea0: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
6eb0: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
6ec0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
6ed0: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
6ee0: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
6ef0: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
6f00: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
6f10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
6f20: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
6f30: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
6f40: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
6f50: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
6f60: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
6f70: 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
6f80: 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
6f90: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
6fa0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
6fb0: 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
6fc0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
6fd0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
6fe0: 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
6ff0: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
7000: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
7010: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
7020: 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a  len; .  int i; .
7030: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
7040: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
7050: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7060: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
7070: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
7080: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
7090: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
70a0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
70b0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
70c0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
70d0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
70e0: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
70f0: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
7100: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
7110: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
7120: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
7130: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
7140: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
7150: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
7160: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7170: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
7180: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
7190: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
71a0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
71b0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
71c0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
71d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
71e0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
71f0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
7200: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
7210: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7220: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
7230: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7240: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
7250: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
7260: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7270: 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  d, PAGER_MJ_PGNO
7280: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
7290: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
72a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
72b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
72c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
72d0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
72e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
72f0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7300: 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75  .  put32bits(zBu
7310: 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32  f, len);.  put32
7320: 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63  bits(&zBuf[4], c
7330: 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ksum);.  memcpy(
7340: 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e  &zBuf[8], aJourn
7350: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
7360: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
7370: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
7380: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
7390: 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65  fd, zBuf, 8+size
73a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
73b0: 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  ));.  pPager->ne
73c0: 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
73d0: 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75  ->noSync;.  retu
73e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
73f0: 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20  Add or remove a 
7400: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  page from the li
7410: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
7420: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a  that are in the.
7430: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
7440: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
7450: 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65  Pager keeps a se
7460: 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70  parate list of p
7470: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75  ages that are cu
7480: 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68  rrently in.** th
7490: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
74a0: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
74b0: 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65   the sqlite3page
74c0: 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a  r_stmt_commit().
74d0: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
74e0: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
74f0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
7500: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
7510: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
7520: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
7530: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
7540: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
7550: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
7560: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
7570: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
7580: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
7590: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
75a0: 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
75b0: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
75c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
75d0: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
75e0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  pPg->pNextStmt==
75f0: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  0 );.  pPg->pPre
7600: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  vStmt = 0;.  if(
7610: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29   pPager->pStmt )
7620: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  {.    pPager->pS
7630: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
7640: 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
7650: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
7660: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50  ger->pStmt;.  pP
7670: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
7680: 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  g;.  pPg->inStmt
7690: 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 1;.}.static v
76a0: 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f  oid page_remove_
76b0: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50  from_stmt_list(P
76c0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
76d0: 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  ( !pPg->inStmt )
76e0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
76f0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b  Pg->pPrevStmt ){
7700: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
7710: 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65  ->pPrevStmt->pNe
7720: 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  xtStmt==pPg );. 
7730: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
7740: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  t->pNextStmt = p
7750: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
7760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
7770: 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
7780: 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  >pStmt==pPg );. 
7790: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
77a0: 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pStmt = pPg->pNe
77b0: 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66  xtStmt;.  }.  if
77c0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  ( pPg->pNextStmt
77d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
77e0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e  pPg->pNextStmt->
77f0: 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29  pPrevStmt==pPg )
7800: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
7810: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
7820: 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  = pPg->pPrevStmt
7830: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
7840: 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  xtStmt = 0;.  pP
7850: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
7860: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
7870: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  = 0;.}../*.** Fi
7880: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
7890: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
78a0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
78b0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
78c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
78d0: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
78e0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
78f0: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
7900: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
7910: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
7920: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
7930: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
7940: 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  sh==0 ) return 0
7950: 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  ;.  p = pPager->
7960: 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50  aHash[pgno & (pP
7970: 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b  ager->nHash-1)];
7980: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
7990: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
79a0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
79b0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
79c0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
79d0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
79e0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  se file..**.** O
79f0: 6e 63 65 20 61 6c 6c 20 6c 6f 63 6b 73 20 68 61  nce all locks ha
7a00: 76 65 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  ve been removed 
7a10: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
7a20: 65 20 66 69 6c 65 2c 20 6f 74 68 65 72 0a 2a 2a  e file, other.**
7a30: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 20 74 68   processes or th
7a40: 72 65 61 64 73 20 6d 69 67 68 74 20 63 68 61 6e  reads might chan
7a50: 67 65 20 74 68 65 20 66 69 6c 65 2e 20 20 53 6f  ge the file.  So
7a60: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6f   make sure all o
7a70: 66 0a 2a 2a 20 6f 75 72 20 69 6e 74 65 72 6e 61  f.** our interna
7a80: 6c 20 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c  l cache is inval
7a90: 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idated..*/.stati
7aa0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
7ab0: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
7ac0: 72 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  r){.  if( !MEMDB
7ad0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7ae0: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
7af0: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
7b00: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
7b10: 20 3d 20 2d 31 3b 0a 20 20 20 20 49 4f 54 52 41   = -1;.    IOTRA
7b20: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e  CE(("UNLOCK %p\n
7b30: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 7d 0a  ", pPager)).  }.
7b40: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7b50: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7b60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
7b70: 2d 3e 70 41 6c 6c 3d 3d 30 20 29 3b 0a 7d 0a 0a  ->pAll==0 );.}..
7b80: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
7b90: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
7ba0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
7bb0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
7bc0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
7bd0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
7be0: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
7bf0: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
7c00: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
7c10: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
7c20: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
7c30: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
7c40: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
7c50: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
7c60: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
7c70: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
7c80: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
7c90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7ca0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
7cb0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
7cc0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
7cd0: 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  t;.  if( pPager-
7ce0: 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
7cf0: 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  n;.  for(pPg=pPa
7d00: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
7d10: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
7d20: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
7d30: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
7d40: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
7d50: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
7d60: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7d70: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
7d80: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
7d90: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
7da0: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  >pAll = 0;.  pPa
7db0: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a  ger->nHash = 0;.
7dc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
7dd0: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
7de0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
7df0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
7e00: 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  h = 0;.  if( pPa
7e10: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
7e20: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
7e30: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
7e40: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
7e50: 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
7e60: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ock(pPager);.  p
7e70: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
7e80: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7e90: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70  r->errCode || (p
7ea0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
7eb0: 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  en==0 && pPager-
7ec0: 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b  >stmtOpen==0) );
7ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
7ee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7ef0: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
7f00: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
7f10: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
7f20: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
7f30: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
7f40: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
7f50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7f60: 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61  leases.** the da
7f70: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
7f80: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
7f90: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
7fa0: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
7fb0: 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c  l.** file is del
7fc0: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
7fd0: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
7fe0: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
7ff0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
8000: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
8010: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
8020: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
8030: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
8040: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
8050: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
8060: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
8070: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
8080: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
8090: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
80a0: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
80b0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
80c0: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
80d0: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
80e0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
80f0: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
8100: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
8110: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8120: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67    }.  sqlite3pag
8130: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
8140: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
8150: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
8160: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
8170: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
8180: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
8190: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
81a0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
81b0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
81c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
81d0: 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
81e0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
81f0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
8200: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
8210: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
8220: 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nal);.    sqlite
8230: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
8240: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
8250: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
8260: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
8270: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
8280: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
8290: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
82a0: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
82b0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
82c0: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
82d0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
82e0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
82f0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
8300: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
8310: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
8320: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
8330: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
8340: 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
8350: 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
8360: 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  ache = 0;.    pP
8370: 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
8380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
8390: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
83a0: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
83b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
83c0: 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
83d0: 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  || pPager->useJo
83e0: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a  urnal==0 );.  }.
83f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8400: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
8410: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
8420: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
8430: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
8440: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
8450: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  bSize = 0;.  pPa
8460: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
8470: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
8480: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
8490: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
84a0: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
84b0: 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  rst;.  pPager->d
84c0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65  bSize = -1;.  re
84d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
84e0: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
84f0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
8500: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
8510: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
8520: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
8530: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
8540: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
8550: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
8560: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
8570: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
8580: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
8590: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
85a0: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
85b0: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
85c0: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
85d0: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
85e0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
85f0: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
8600: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
8610: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
8620: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
8630: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
8640: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
8650: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
8660: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
8670: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
8680: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
8690: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
86a0: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
86b0: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
86c0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
86d0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
86e0: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
86f0: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
8700: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
8710: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
8720: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
8730: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
8740: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
8750: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
8760: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
8770: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
8780: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
8790: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
87a0: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
87b0: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
87c0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
87d0: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
87e0: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
87f0: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
8800: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
8810: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
8820: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
8830: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
8840: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
8850: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
8860: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
8870: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
8880: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
8890: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
88a0: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
88b0: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
88c0: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
88d0: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
88e0: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
88f0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
8900: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
8910: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
8920: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
8930: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
8940: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
8950: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8960: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
8970: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
8980: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
8990: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
89a0: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
89b0: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
89c0: 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
89d0: 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
89e0: 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a  an(PgHdr*);../*.
89f0: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
8a00: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
8a10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8a20: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
8a30: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
8a40: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
8a50: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
8a60: 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d  useCksum==0 it m
8a70: 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61  eans this journa
8a80: 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63  l does not use c
8a90: 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b  hecksums.  Check
8aa0: 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  sums.** are not 
8ab0: 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e  used in statemen
8ac0: 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75  t journals becau
8ad0: 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  se statement jou
8ae0: 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20  rnals do not.** 
8af0: 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20  need to survive 
8b00: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a  power failures..
8b10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
8b20: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
8b30: 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  _page(Pager *pPa
8b40: 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64  ger, OsFile *jfd
8b50: 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b  , int useCksum){
8b60: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
8b70: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
8b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
8b90: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
8ba0: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
8bb0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8bd0: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
8be0: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
8bf0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
8c00: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
8c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
8c20: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
8c30: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
8c40: 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20  /.  u8 *aData = 
8c50: 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
8c60: 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65  mpSpace;   /* Te
8c70: 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  mp storage for a
8c80: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75   page */..  /* u
8c90: 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62  seCksum should b
8ca0: 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d  e true for the m
8cb0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
8cc0: 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73  false for.  ** s
8cd0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8ce0: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
8cf0: 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  this is always t
8d00: 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61  he case.  */.  a
8d10: 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75  ssert( jfd == (u
8d20: 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72  seCksum ? pPager
8d30: 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
8d40: 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  stfd) );.  asser
8d50: 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72  t( aData );..  r
8d60: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
8d70: 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  fd, &pgno);.  if
8d80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8d90: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
8da0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
8db0: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
8dc0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
8dd0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8de0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8df0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
8e00: 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
8e10: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a  ->pageSize + 4;.
8e20: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
8e30: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
8e40: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
8e50: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
8e60: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
8e70: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
8e80: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
8e90: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
8ea0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8eb0: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
8ec0: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
8ed0: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
8ee0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
8ef0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
8f00: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
8f10: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
8f20: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
8f30: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
8f40: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
8f50: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
8f60: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
8f70: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
8f80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8f90: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
8fa0: 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65  f( pgno>(unsigne
8fb0: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
8fc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8fd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
8fe0: 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a  if( useCksum ){.
8ff0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
9000: 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29  its(jfd, &cksum)
9010: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
9020: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
9030: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9040: 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70   += 4;.    if( p
9050: 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
9060: 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  r, aData)!=cksum
9070: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9080: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
9090: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
90a0: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
90b0: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
90c0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
90d0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
90e0: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
90f0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
9100: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
9110: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
9120: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
9130: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
9140: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
9150: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
9160: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
9170: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
9180: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
9190: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
91a0: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
91b0: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
91c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
91d0: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
91e0: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
91f0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
9200: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
9210: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
9220: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
9230: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
9240: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
9250: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
9260: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
9270: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
9280: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
9290: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
92a0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
92b0: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
92c0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
92d0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
92e0: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
92f0: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
9300: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
9310: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
9320: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9330: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
9340: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
9350: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
9360: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
9370: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
9380: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
9390: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
93a0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
93b0: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
93c0: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
93d0: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
93e0: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20  contents are in 
93f0: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
9400: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
9410: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
9420: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f   full ROLLBACK o
9430: 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
9440: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72  statement.  ** r
9450: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c  ollback the full
9460: 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e   ROLLBACK will n
9470: 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65 20 70  ot restore the p
9480: 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  age to its origi
9490: 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  nal.  ** content
94a0: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
94b0: 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65  s must be met be
94c0: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
94d0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
94e0: 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  * files. (1) the
94f0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
9500: 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  e locked.  (2) w
9510: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
9520: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61  original.  ** pa
9530: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e  ge content is in
9540: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
9550: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
9560: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
9570: 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f   in.  ** cache o
9580: 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72  r else it is mar
9590: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
95a0: 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  =0..  */.  pPg =
95b0: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
95c0: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
95d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
95e0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
95f0: 55 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20  USIVE || pPg!=0 
9600: 29 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41  );.  TRACE3("PLA
9610: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
9620: 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
9630: 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ger), pgno);.  i
9640: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
9650: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
9660: 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20  E && (pPg==0 || 
9670: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
9680: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
9690: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
96a0: 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
96b0: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
96c0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
96d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
96e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
96f0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9700: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
9710: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9720: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9730: 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b  pPg ){.      mak
9740: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
9750: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67   }.  }.  if( pPg
9760: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
9770: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
9780: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
9790: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
97a0: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
97b0: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
97c0: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
97d0: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
97e0: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
97f0: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
9800: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
9810: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
9820: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
9830: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
9840: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
9850: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
9860: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
9870: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
9880: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 70  .    ** sqlite3p
9890: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 2e  ager_rollback().
98a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
98b0: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20   *pData;.    /* 
98c0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
98d0: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
98e0: 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70  o==1 ); */.    p
98f0: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
9900: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
9910: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
9920: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
9930: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
9940: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
9950: 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20  or ){  /*** FIX 
9960: 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68 69 73  ME:  Should this
9970: 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a   be xReinit? ***
9980: 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
9990: 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
99a0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
99b0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ize);.    }.#ifd
99c0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
99d0: 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
99e0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
99f0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
9a00: 65 6e 64 69 66 0a 20 20 20 20 43 4f 44 45 43 31  endif.    CODEC1
9a10: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
9a20: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
9a30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
9a50: 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68  er zMaster is th
9a60: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
9a70: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
9a80: 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   A single journa
9a90: 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72  l.** file that r
9aa0: 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d  eferred to the m
9ab0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9ac0: 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  le has just been
9ad0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
9ae0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
9af0: 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f  ecks if it is po
9b00: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
9b10: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9b20: 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64  nal file,.** and
9b30: 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69   does so if it i
9b40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  s..**.** The mas
9b50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9b60: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
9b70: 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  mes of all child
9b80: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f   journals..** To
9b90: 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65   tell if a maste
9ba0: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
9bb0: 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20   deleted, check 
9bc0: 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  to each of the.*
9bd0: 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20  * children.  If 
9be0: 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65  all children are
9bf0: 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20   either missing 
9c00: 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20  or do not refer 
9c10: 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e  to.** a differen
9c20: 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
9c30: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74  , then this mast
9c40: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
9c50: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  e deleted..*/.st
9c60: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
9c70: 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63  elmaster(const c
9c80: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
9c90: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d   int rc;.  int m
9ca0: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a  aster_open = 0;.
9cb0: 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72    OsFile *master
9cc0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d   = 0;.  char *zM
9cd0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
9ce0: 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
9cf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9d00: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
9d10: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
9d20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
9d30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9d40: 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e  le */..  /* Open
9d50: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9d60: 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69  nal file exclusi
9d70: 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d  vely in case som
9d80: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
9d90: 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20    ** is running 
9da0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  this routine als
9db0: 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d  o. Not that it m
9dc0: 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69  akes too much di
9dd0: 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
9de0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
9df0: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73  penReadOnly(zMas
9e00: 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20  ter, &master);. 
9e10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9e20: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
9e30: 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65  ter_out;.  maste
9e40: 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63  r_open = 1;.  rc
9e50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
9e60: 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d  Size(master, &nM
9e70: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
9e80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9e90: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
9ea0: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20  ter_out;..  if( 
9eb0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30  nMasterJournal>0
9ec0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a   ){.    char *zJ
9ed0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72  ournal;.    char
9ee0: 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30   *zMasterPtr = 0
9ef0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
9f00: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
9f10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
9f20: 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
9f30: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
9f40: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
9f50: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
9f60: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a  MasterJournal. .
9f70: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74      */.    zMast
9f80: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61  erJournal = (cha
9f90: 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
9fa0: 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (nMasterJournal)
9fb0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
9fc0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
9fd0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
9fe0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
9ff0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a000: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
a010: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73  qlite3OsRead(mas
a020: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
a030: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
a040: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nal);.    if( rc
a050: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
a060: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a070: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
a080: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
a090: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
a0a0: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
a0b0: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
a0c0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
a0d0: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
a0e0: 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29  Exists(zJournal)
a0f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
a100: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
a110: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
a120: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a130: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
a140: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
a150: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
a160: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
a170: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
a180: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
a190: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
a1a0: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
a1b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
a1c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a1d0: 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e     OsFile *journ
a1e0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  al = 0;.        
a1f0: 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20  int c;..        
a200: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
a210: 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72  enReadOnly(zJour
a220: 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a  nal, &journal);.
a230: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
a240: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a250: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
a260: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
a270: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
a280: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
a290: 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a  rnal(journal, &z
a2a0: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
a2b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
a2c0: 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(&journal);.  
a2d0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a2e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a2f0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
a300: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
a310: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
a320: 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26  zMasterPtr!=0 &&
a330: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
a340: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
a350: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
a360: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
a370: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
a380: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
a390: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
a3a0: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
a3b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a3c0: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
a3d0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
a3e0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
a3f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
a400: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
a410: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
a420: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
a430: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
a440: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
a450: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
a460: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
a470: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
a480: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
a490: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
a4a0: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
a4b0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a4c0: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
a4d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a4e0: 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20  *.** Make every 
a4f0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
a500: 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61  e agree with wha
a510: 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49  t is on disk.  I
a520: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a  n other words,.*
a530: 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73  * reread the dis
a540: 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  k to reset the s
a550: 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68  tate of the cach
a560: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a570: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a580: 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  after a rollback
a590: 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f   in which some o
a5a0: 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68  f the dirty cach
a5b0: 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e  e.** pages had n
a5c0: 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
a5d0: 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20  n out to disk.  
a5e0: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20  We need to roll 
a5f0: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68  back the.** cach
a600: 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  e content and th
a610: 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
a620: 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72   do that is to r
a630: 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f  eread the old co
a640: 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72  ntent.** back fr
a650: 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a  om the disk..*/.
a660: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a670: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61  _reload_cache(Pa
a680: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a690: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
a6a0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a6b0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
a6c0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
a6d0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
a6e0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75  ){.    char *zBu
a6f0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  f = pPager->pTmp
a700: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 2f 2a  Space;        /*
a710: 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f   Temp storage fo
a720: 72 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  r one page */.  
a730: 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74    if( !pPg->dirt
a740: 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
a750: 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
a760: 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
a770: 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
a780: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a790: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
a7a0: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
a7b0: 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e 70  ize*(i64)(pPg->p
a7c0: 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 69  gno-1));.      i
a7d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a7e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
a7f0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
a800: 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
a810: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a820: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a830: 20 20 54 52 41 43 45 33 28 22 52 45 46 45 54 43    TRACE3("REFETC
a840: 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
a850: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
a860: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
a870: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
a880: 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31  ak;.      CODEC1
a890: 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70  (pPager, zBuf, p
a8a0: 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20  Pg->pgno, 2);.  
a8b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
a8c0: 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70  emset(zBuf, 0, p
a8d0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
a8e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a8f0: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
a900: 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48  memcmp(zBuf, PGH
a910: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
a920: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a930: 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  e) ){.      memc
a940: 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
a950: 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61  (pPg), zBuf, pPa
a960: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a970: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
a980: 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
a990: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
a9a0: 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54  Reiniter(PGHDR_T
a9b0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
a9c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a9d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a9e0: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
a9f0: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
aa00: 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
aa10: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
aa20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
aa30: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
aa40: 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
aa50: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
aa60: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
aa70: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
aa80: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
aa90: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
aaa0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 44    }.  pPager->pD
aab0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75  irty = 0;.  retu
aac0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
aad0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
aae0: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
aaf0: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
ab00: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ab10: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  .** indicated..*
ab20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
ab30: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
ab40: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
ab50: 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
ab60: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
ab70: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
ab80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
ab90: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
aba0: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
abb0: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
abc0: 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nPage);.}../*.**
abd0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
abe0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
abf0: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
ac00: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
ac10: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
ac20: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
ac30: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
ac40: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
ac50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
ac60: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
ac70: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
ac80: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
ac90: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
aca0: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
acb0: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
acc0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
acd0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
ace0: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
acf0: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
ad00: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
ad10: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
ad20: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
ad30: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
ad40: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
ad50: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
ad60: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
ad70: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
ad80: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
ad90: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
ada0: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
adb0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
adc0: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
add0: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
ade0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
adf0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
ae00: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
ae10: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
ae20: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
ae30: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
ae40: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
ae50: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
ae60: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
ae70: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
ae80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ae90: 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20  .**       name. 
aea0: 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62   The value may b
aeb0: 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65  e zero (indicate
aec0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
aed0: 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  o master.**     
aee0: 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20    journal.).**  
aef0: 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20  (6)  N bytes of 
af00: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
af10: 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61  al name.  The na
af20: 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74  me will be nul-t
af30: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20  erminated.**    
af40: 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20     and might be 
af50: 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65  shorter than the
af60: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
af70: 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69   (5).  If the fi
af80: 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  rst byte.**     
af90: 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73    of the name is
afa0: 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65   \000 then there
afb0: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   is no master jo
afc0: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74  urnal.  The mast
afd0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
afe0: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72  nal name is stor
aff0: 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
b000: 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (7)  Zero or mo
b010: 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
b020: 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
b030: 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
b040: 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
b050: 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
b060: 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
b070: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
b080: 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
b090: 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
b0a0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
b0b0: 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
b0c0: 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
b0d0: 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69  an the first 6 i
b0e0: 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
b0f0: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
b100: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
b110: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37  nstance of the 7
b120: 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
b130: 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
b140: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
b150: 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
b160: 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
b170: 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
b180: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
b190: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
b1a0: 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
b1b0: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
b1c0: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
b1d0: 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
b1e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b1f0: 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
b200: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
b210: 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
b220: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
b230: 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
b240: 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
b250: 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
b260: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b270: 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
b280: 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
b290: 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
b2a0: 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
b2b0: 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
b2c0: 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
b2d0: 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
b2e0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
b2f0: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
b300: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
b310: 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
b320: 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
b330: 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
b340: 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
b350: 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
b360: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
b370: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
b380: 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
b390: 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
b3a0: 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
b3b0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
b3c0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
b3d0: 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
b3e0: 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
b3f0: 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
b400: 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
b410: 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
b420: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
b430: 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
b440: 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
b450: 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
b460: 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
b470: 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
b480: 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
b490: 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
b4a0: 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
b4b0: 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
b4c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
b4d0: 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
b4e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
b4f0: 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
b500: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
b510: 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
b520: 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
b530: 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
b540: 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
b550: 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
b560: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b570: 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
b580: 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
b590: 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
b5a0: 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
b5b0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
b5c0: 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
b5d0: 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
b5e0: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
b5f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
b600: 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
b610: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
b620: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
b630: 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
b640: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
b650: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
b660: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b670: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
b680: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
b690: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
b6a0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b6b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b6c0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
b6d0: 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
b6e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b6f0: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
b700: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
b710: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b730: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b740: 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
b750: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b760: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
b770: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
b780: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b7a0: 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
b7b0: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
b7c0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
b7d0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
b7e0: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
b7f0: 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
b800: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
b810: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
b820: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
b830: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
b840: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
b850: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
b860: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
b870: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
b880: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
b890: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
b8a0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
b8b0: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
b8c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b8d0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
b8e0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
b8f0: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
b900: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
b910: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
b920: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
b930: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
b940: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
b950: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
b960: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
b970: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
b980: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
b990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
b9a0: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
b9b0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
b9c0: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
b9d0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
b9e0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
b9f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
ba00: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
ba10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
ba20: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
ba30: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
ba40: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
ba50: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
ba60: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
ba70: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
ba80: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
ba90: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
baa0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
bab0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
bac0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
bad0: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
bae0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
baf0: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
bb00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
bb10: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
bb20: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
bb30: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
bb40: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
bb50: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
bb60: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
bb70: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
bb80: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
bb90: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
bba0: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
bbb0: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
bbc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
bbd0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
bbe0: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
bbf0: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
bc00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bc10: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
bc20: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
bc30: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
bc40: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
bc50: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
bc60: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
bc70: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
bc80: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
bc90: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
bca0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
bcb0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
bcc0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
bcd0: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
bce0: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
bcf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bd00: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
bd10: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
bd20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
bd30: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
bd40: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
bd50: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
bd60: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
bd70: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
bd80: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
bd90: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
bda0: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
bdb0: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
bdc0: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
bdd0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
bde0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
bdf0: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
be00: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
be10: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
be20: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
be30: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
be40: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
be50: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
be60: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
be70: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
be80: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
be90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bea0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
beb0: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
bec0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
bed0: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
bee0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
bef0: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
bf00: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
bf10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
bf20: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
bf30: 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
bf40: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
bf50: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
bf60: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
bf70: 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20  le back to it's 
bf80: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
bf90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
bfa0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
bfb0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
bfc0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
bfd0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
bfe0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
bff0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
c000: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
c010: 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50  gDbSize==0 || pP
c020: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
c030: 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20  ==mxPg );.      
c040: 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
c050: 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
c060: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
c070: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c080: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c090: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
c0a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
c0b0: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
c0c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
c0d0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
c0e0: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
c0f0: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
c100: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c110: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
c120: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
c130: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
c140: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
c150: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
c160: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
c170: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c180: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c190: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c1a0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
c1b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c1c0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
c1d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c1e0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
c1f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c210: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
c220: 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
c230: 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
c240: 6c 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  l, then the data
c250: 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a  base.          *
c260: 2a 20 69 73 20 70 72 6f 62 61 62 6c 79 20 6e 6f  * is probably no
c270: 74 20 72 65 63 6f 76 65 72 61 62 6c 65 2e 20 20  t recoverable.  
c280: 52 65 74 75 72 6e 20 43 4f 52 52 55 50 54 2e 0a  Return CORRUPT..
c290: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
c2a0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
c2b0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
c2c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c2d0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
c2e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c2f0: 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
c300: 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
c310: 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
c320: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
c330: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
c340: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
c350: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
c360: 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72   }.  if( zMaster
c370: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
c380: 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
c390: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
c3a0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
c3b0: 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20  eturn true,.    
c3c0: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
c3d0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
c3e0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c3f0: 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
c400: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c410: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
c420: 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
c430: 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  r(zMaster);.    
c440: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
c450: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a  (zMaster);.  }..
c460: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
c470: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
c480: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
c490: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
c4a0: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
c4b0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
c4c0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
c4d0: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
c4e0: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
c4f0: 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ZE.  ** value. R
c500: 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
c510: 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
c520: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
c530: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   */.  pPager->se
c540: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
c550: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
c560: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 72 65  Pager->fd);.  re
c570: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c580: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
c590: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c5a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
c5b0: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
c5c0: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
c5d0: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
c5e0: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
c5f0: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
c600: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
c610: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
c620: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
c630: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
c640: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
c650: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
c660: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
c670: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
c680: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
c690: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
c6a0: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
c6b0: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
c6c0: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
c6d0: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
c6e0: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
c6f0: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
c700: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
c710: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c720: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
c730: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
c740: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
c750: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
c760: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
c770: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
c780: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
c790: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
c7a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
c7b0: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
c7c0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72  nal */.  i64 hdr
c7d0: 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b  Off;.  int nRec;
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
c800: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c820: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
c830: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
c840: 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
c850: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66  >journalOff;.#if
c860: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b  ndef NDEBUG .  {
c870: 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b  .    i64 os_szJ;
c880: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c890: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
c8a0: 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a  er->jfd, &os_szJ
c8b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
c8c0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
c8d0: 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  n rc;.    assert
c8e0: 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b  ( szJ==os_szJ );
c8f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
c900: 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20  * Set hdrOff to 
c910: 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75  be the offset ju
c920: 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  st after the end
c930: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75   of the last jou
c940: 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77  rnal.  ** page w
c950: 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68  ritten before th
c960: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  e first journal-
c970: 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20  header for this 
c980: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
c990: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77  ransaction was w
c9a0: 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65  ritten, or the e
c9b0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
c9c0: 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  f no journal.  *
c9d0: 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  * header was wri
c9e0: 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  tten..  */.  hdr
c9f0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
ca00: 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65  mtHdrOff;.  asse
ca10: 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
ca20: 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20  Sync || !hdrOff 
ca30: 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66  );.  if( !hdrOff
ca40: 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d   ){.    hdrOff =
ca50: 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   szJ;.  }.  .  /
ca60: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
ca70: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
ca80: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
ca90: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
caa0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
cab0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
cac0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
cad0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
cae0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
caf0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
cb00: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
cb10: 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
cb20: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
cb30: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
cb40: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ize;..  /* Figur
cb50: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
cb60: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
cb70: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
cb80: 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
cb90: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
cba0: 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d  InUse && pPager-
cbb0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
cbc0: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
cbd0: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
cbe0: 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65  ;.  nRec = pPage
cbf0: 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a  r->stmtNRec;.  .
cc00: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
cc10: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
cc20: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
cc30: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
cc40: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
cc50: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
cc60: 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
cc70: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69  ment journal omi
cc80: 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f  ts checksums fro
cc90: 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f  m.  ** each reco
cca0: 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66  rd since power-f
ccb0: 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20  ailure recovery 
ccc0: 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  is not important
ccd0: 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20   to statement.  
cce0: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ** journals..  *
ccf0: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
cd00: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
cd10: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
cd20: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
cd30: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
cd40: 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  tfd, 0);.    ass
cd50: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
cd60: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
cd70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
cd80: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
cd90: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
cda0: 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20  * Now roll some 
cdb0: 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  pages back from 
cdc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
cdd0: 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73  journal. Pager.s
cde0: 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61  tmtJSize.  ** wa
cdf0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
ce00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
ce10: 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  hen this stateme
ce20: 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  nt was started, 
ce30: 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69  so.  ** everythi
ce40: 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65  ng after that ne
ce50: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
ce60: 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e   back, either in
ce70: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
ce80: 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79  base, the memory
ce90: 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e   cache, or both.
cea0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74  .  **.  ** If it
ceb0: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
cec0: 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72  en Pager.stmtHdr
ced0: 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65  Off is the offse
cee0: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
cef0: 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
cf00: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
cf10: 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74  written during t
cf20: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
cf30: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
cf40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cf50: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
cf60: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  , pPager->stmtJS
cf70: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
cf80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cf90: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
cfa0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
cfb0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cfc0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
cfd0: 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
cfe0: 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
cff0: 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
d000: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
d010: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64  >journalOff < hd
d020: 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  rOff ){.    rc =
d030: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d040: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d050: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
d060: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
d070: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
d080: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d090: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
d0a0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
d0b0: 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70  .  }..  while( p
d0c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d0d0: 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75  f < szJ ){.    u
d0e0: 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20  32 nJRec;       
d0f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
d100: 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
d110: 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
d120: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
d130: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
d140: 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
d150: 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72  ummy);.    if( r
d160: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d170: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
d180: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
d190: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
d1a0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
d1b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52     }.    if( nJR
d1c0: 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ec==0 ){.      n
d1d0: 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  JRec = (szJ - pP
d1e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d1f0: 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67  ) / (pPager->pag
d200: 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a  eSize+8);.    }.
d210: 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d      for(i=nJRec-
d220: 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65  1; i>=0 && pPage
d230: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
d240: 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  szJ; i--){.     
d250: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
d260: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
d270: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
d280: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  d, 1);.      ass
d290: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
d2a0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66  DONE );.      if
d2b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d2c0: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
d2d0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
d2e0: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
d2f0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
d300: 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  .  .end_stmt_pla
d310: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
d320: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20  =SQLITE_OK) {.  
d330: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
d340: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
d350: 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  /* pager_reload_
d360: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a  cache(pPager); *
d370: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
d380: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
d390: 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
d3a0: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
d3b0: 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
d3c0: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
d3d0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
d3e0: 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61  set_cachesize(Pa
d3f0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d400: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
d410: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
d420: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
d430: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
d440: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
d450: 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
d460: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
d470: 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
d480: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
d490: 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
d4a0: 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
d4b0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
d4c0: 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
d4d0: 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
d4e0: 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
d4f0: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
d500: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
d510: 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
d520: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
d530: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
d540: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
d550: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
d560: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
d570: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
d580: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
d590: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
d5a0: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
d5b0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
d5c0: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
d5d0: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
d5e0: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
d5f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
d600: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
d610: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
d620: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
d630: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
d640: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
d650: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
d660: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
d670: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d680: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
d690: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
d6a0: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
d6b0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
d6c0: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
d6d0: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
d6e0: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
d6f0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
d710: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
d720: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
d730: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
d740: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
d750: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
d760: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
d770: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
d780: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
d790: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
d7a0: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
d7b0: 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
d7c0: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
d7d0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
d7e0: 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
d7f0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
d800: 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
d810: 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
d820: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
d830: 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
d840: 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
d850: 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
d860: 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
d870: 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
d880: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
d890: 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
d8a0: 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
d8b0: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
d8c0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
d8d0: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
d8e0: 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
d8f0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
d900: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
d910: 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
d920: 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
d930: 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
d940: 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
d950: 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
d960: 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
d970: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
d980: 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
d990: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
d9a0: 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50  t_safety_level(P
d9b0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
d9c0: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
d9d0: 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67  l_fsync){.  pPag
d9e0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
d9f0: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
da00: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
da10: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
da20: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
da30: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
da40: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66    pPager->full_f
da50: 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e  sync = full_fsyn
da60: 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
da70: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
da80: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
da90: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
daa0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
dab0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
dac0: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
dad0: 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
dae0: 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
daf0: 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
db00: 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
db10: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
db20: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
db30: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
db40: 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
db50: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
db60: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
db70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
db80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
db90: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
dba0: 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68   .**.** Write th
dbb0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
dbc0: 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
dbd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
dbe0: 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
dbf0: 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
dc00: 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
dc10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69  .**.** The OS wi
dc20: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
dc30: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
dc40: 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
dc50: 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e  it is.** closed.
dc60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
dc70: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
dc80: 74 65 6d 70 28 4f 73 46 69 6c 65 20 2a 2a 70 46  temp(OsFile **pF
dc90: 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  d){.  int cnt = 
dca0: 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  8;.  int rc;.  c
dcb0: 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54 45  har zFile[SQLITE
dcc0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
dcd0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
dce0: 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
dcf0: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
dd00: 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
dd10: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
dd20: 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
dd30: 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d  f.  do{.    cnt-
dd40: 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  -;.    sqlite3Os
dd50: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69  TempFileName(zFi
dd60: 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  le);.    rc = sq
dd70: 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
dd80: 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c  sive(zFile, pFd,
dd90: 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63   1);.  }while( c
dda0: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
ddb0: 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
ddc0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
ddd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
dde0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
ddf0: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
de00: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
de10: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
de20: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
de30: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
de40: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
de50: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
de60: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
de70: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
de80: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70  call to sqlite3p
de90: 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69  ager_get() and i
dea0: 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
deb0: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
dec0: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
ded0: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
dee0: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  3pager_unref()..
def0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
df00: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
df10: 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
df20: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
df30: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
df40: 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
df50: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
df60: 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
df70: 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
df80: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
df90: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
dfa0: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
dfb0: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
dfc0: 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  then all informa
dfd0: 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
dfe0: 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20  cache..** It is 
dff0: 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
e000: 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e   disk.  This can
e010: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
e020: 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d  ement an.** in-m
e030: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
e040: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
e050: 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65  ger_open(.  Page
e060: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
e070: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
e080: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
e090: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
e0a0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
e0b0: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
e0c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e0d0: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
e0e0: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
e0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
e100: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
e110: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
e120: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
e130: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
e140: 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
e150: 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
e160: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  le */.){.  Pager
e170: 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20   *pPager = 0;.  
e180: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
e190: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ame = 0;.  int n
e1a0: 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70  ameLen;  /* Comp
e1b0: 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20 54  iler is wrong. T
e1c0: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 69 6e  his is always in
e1d0: 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65  itialized before
e1e0: 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65   use */.  OsFile
e1f0: 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *fd;.  int rc =
e200: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
e210: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
e220: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
e230: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
e240: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
e250: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
e260: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
e270: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
e280: 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
e290: 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
e2a0: 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
e2b0: 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  !=0;.  char zTem
e2c0: 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
e2d0: 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65 66 20  E_SIZE];.#ifdef 
e2e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
e2f0: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
e300: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
e310: 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73  cannot fail in s
e320: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
e330: 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  () as one or mor
e340: 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a  e calls to .  **
e350: 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68   malloc() must h
e360: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
e370: 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74 68   made by this th
e380: 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20 67  read before it g
e390: 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ets.  ** to this
e3a0: 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61   point. This mea
e3b0: 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74  ns the ThreadDat
e3c0: 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  a must have been
e3d0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61   allocated alrea
e3e0: 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  dy.  ** so that 
e3f0: 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
e400: 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20 49 74  c can be set. It
e410: 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65 20 74   would be nice t
e420: 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 74 68  o assert.  ** th
e430: 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
e440: 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  lloc is non-zero
e450: 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69 73 20  , but alas this 
e460: 62 72 65 61 6b 73 20 74 65 73 74 20 63 61 73 65  breaks test case
e470: 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  s .  ** written 
e480: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 70 61  to invoke the pa
e490: 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  ger directly..  
e4a0: 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61 20  */.  ThreadData 
e4b0: 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54  *pTsd = sqlite3T
e4c0: 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61  hreadData();.  a
e4d0: 73 73 65 72 74 28 20 70 54 73 64 20 29 3b 0a 23  ssert( pTsd );.#
e4e0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 6d  endif..  /* If m
e4f0: 61 6c 6c 6f 63 28 29 20 68 61 73 20 61 6c 72 65  alloc() has alre
e500: 61 64 79 20 66 61 69 6c 65 64 20 72 65 74 75 72  ady failed retur
e510: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  n SQLITE_NOMEM. 
e520: 42 65 66 6f 72 65 20 65 76 65 6e 0a 20 20 2a 2a  Before even.  **
e530: 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 68 69   testing for thi
e540: 73 2c 20 73 65 74 20 2a 70 70 50 61 67 65 72 20  s, set *ppPager 
e550: 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 65 20 63  to NULL so the c
e560: 61 6c 6c 65 72 20 6b 6e 6f 77 73 20 74 68 65 20  aller knows the 
e570: 70 61 67 65 72 0a 20 20 2a 2a 20 73 74 72 75 63  pager.  ** struc
e580: 74 75 72 65 20 77 61 73 20 6e 65 76 65 72 20 61  ture was never a
e590: 6c 6c 6f 63 61 74 65 64 2e 20 0a 20 20 2a 2f 0a  llocated. .  */.
e5a0: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
e5b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
e5c0: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
e5d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e5e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
e5f0: 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a  mset(&fd, 0, siz
e600: 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20 2f 2a 20  eof(fd));..  /* 
e610: 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
e620: 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46 75 6c  ile and set zFul
e630: 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69  lPathname to poi
e640: 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64  nt at malloc()ed
e650: 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f   .  ** memory co
e660: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d  ntaining the com
e670: 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65 20 28  plete filename (
e680: 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74  i.e. including t
e690: 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0a 20  he directory).. 
e6a0: 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
e6b0: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
e6c0: 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  [0] ){.#ifndef S
e6d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
e6e0: 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
e6f0: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
e700: 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
e710: 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
e720: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
e730: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
e740: 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73  up("");.    }els
e750: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
e760: 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61       zFullPathna
e770: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
e780: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
e790: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
e7a0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29   zFullPathname )
e7b0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
e7c0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
e7d0: 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e  Write(zFullPathn
e7e0: 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f  ame, &fd, &readO
e7f0: 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nly);.      }.  
e800: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
e810: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
e820: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 26 66 64 29  er_opentemp(&fd)
e830: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54  ;.    sqlite3OsT
e840: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d  empFileName(zTem
e850: 70 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  p);.    zFilenam
e860: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
e870: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e880: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
e890: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
e8a0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e8b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e8c0: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
e8d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
e8e0: 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
e8f0: 20 73 74 72 75 63 74 75 72 65 2e 20 41 73 20 70   structure. As p
e900: 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20  art of the same 
e910: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f  allocation, allo
e920: 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20  cate.  ** space 
e930: 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74  for the full pat
e940: 68 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20  hs of the file, 
e950: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f  directory and jo
e960: 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67  urnal .  ** (Pag
e970: 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61  er.zFilename, Pa
e980: 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61  ger.zDirectory a
e990: 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
e9a0: 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  l)..  */.  if( z
e9b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
e9c0: 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74      nameLen = st
e9d0: 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rlen(zFullPathna
e9e0: 6d 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  me);.    pPager 
e9f0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
ea00: 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
ea10: 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30  + nameLen*3 + 30
ea20: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
ea30: 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
ea40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
ea50: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
ea60: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
ea70: 61 6c 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f  allocRaw(SQLITE_
ea80: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
ea90: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  E);.    }.  }...
eaa0: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
eab0: 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
eac0: 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
ead0: 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
eae0: 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f   memory .  ** po
eaf0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c  inted to by zFul
eb00: 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20  lPathname, free 
eb10: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
eb20: 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
eb30: 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69  e .  ** file. Si
eb40: 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
eb50: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
eb60: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
eb70: 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
eb80: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
eb90: 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
eba0: 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
ebb0: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c  !zFullPathname |
ebc0: 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  | !pPager->pTmpS
ebd0: 70 61 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49  pace || rc!=SQLI
ebe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
ebf0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
ec00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
ec10: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
ec20: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
ec30: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
ec40: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
ec50: 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45  _OK)?SQLITE_NOME
ec60: 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52  M:rc);.  }..  TR
ec70: 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
ec80: 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
ec90: 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68  D(fd), zFullPath
eca0: 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  name);.  IOTRACE
ecb0: 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
ecc0: 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50  , pPager, zFullP
ecd0: 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50 61 67  athname)).  pPag
ece0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
ecf0: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
ed00: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
ed10: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
ed20: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
ed30: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
ed40: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
ed50: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
ed60: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
ed70: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
ed80: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
ed90: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
eda0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
edb0: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
edc0: 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  name);..  for(i=
edd0: 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20  nameLen; i>0 && 
ede0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
edf0: 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
ee00: 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
ee10: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
ee20: 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20  ory[i-1] = 0;.  
ee30: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
ee40: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
ee50: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  thname);.  sqlit
ee60: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
ee70: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
ee80: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
ee90: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
eea0: 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72  rnal");.  pPager
eeb0: 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20  ->fd = fd;.  /* 
eec0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
eed0: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  pen = 0; */.  pP
eee0: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
eef0: 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26   = useJournal &&
ef00: 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65   !memDb;.  pPage
ef10: 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
ef20: 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
ef30: 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
ef40: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
ef50: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
ef60: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
ef70: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
ef80: 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
ef90: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
efa0: 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
efb0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
efc0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
efd0: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70  AGE_SIZE;.  /* p
efe0: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
eff0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f000: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
f010: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
f020: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
f030: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
f040: 4d 61 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  MaxPage = 0; */.
f050: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
f060: 20 3d 20 31 30 30 3b 0a 20 20 61 73 73 65 72 74   = 100;.  assert
f070: 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d  ( PAGER_UNLOCK==
f080: 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  0 );.  /* pPager
f090: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
f0a0: 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
f0b0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
f0c0: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f0d0: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
f0e0: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
f0f0: 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
f100: 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
f110: 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
f120: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
f130: 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Sync = 0; */.  p
f140: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
f150: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f160: 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
f170: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
f180: 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e  ync = (pPager->n
f190: 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a  oSync?0:1);.  /*
f1a0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
f1b0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f1c0: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
f1d0: 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
f1e0: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
f1f0: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
f200: 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c  Extra = FORCE_AL
f210: 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b  IGNMENT(nExtra);
f220: 0a 20 20 61 73 73 65 72 74 28 66 64 7c 7c 6d 65  .  assert(fd||me
f230: 6d 44 62 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d  mDb);.  if( !mem
f240: 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
f250: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
f260: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
f270: 7a 65 28 66 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a  ze(fd);.  }.  /*
f280: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
f290: 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
f2a0: 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
f2b0: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
f2c0: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
f2d0: 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
f2e0: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64  r = pPager;.#ifd
f2f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f300: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
f310: 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  NT.  pPager->pNe
f320: 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  xt = pTsd->pPage
f330: 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65  r;.  pTsd->pPage
f340: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64  r = pPager;.#end
f350: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
f360: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f370: 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
f380: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
f390: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
f3a0: 67 65 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64  ger_set_busyhand
f3b0: 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ler(Pager *pPage
f3c0: 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r, BusyHandler *
f3d0: 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20  pBusyHandler){. 
f3e0: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
f3f0: 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e  ndler = pBusyHan
f400: 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  dler;.}../*.** S
f410: 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  et the destructo
f420: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
f430: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
f440: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
f450: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e  s called.** when
f460: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
f470: 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67  ount on each pag
f480: 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  e reaches zero. 
f490: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
f4a0: 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  can.** be used t
f4b0: 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72  o clean up infor
f4c0: 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78  mation in the ex
f4d0: 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65  tra segment appe
f4e0: 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67  nded to each pag
f4f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73  e..**.** The des
f500: 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63  tructor is not c
f510: 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c  alled as a resul
f520: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
f530: 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
f540: 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
f550: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
f560: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
f570: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f580: 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72  3pager_set_destr
f590: 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
f5a0: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
f5b0: 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  c)(void*,int)){.
f5c0: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
f5d0: 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
f5e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f5f0: 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  reinitializer fo
f600: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
f610: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
f620: 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
f630: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
f640: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
f650: 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
f660: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
f670: 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61  s original.** va
f680: 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  lue as a result 
f690: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  of a rollback.  
f6a0: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76  The callback giv
f6b0: 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  es higher-level 
f6c0: 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72  code.** an oppor
f6d0: 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72  tunity to restor
f6e0: 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74  e the EXTRA sect
f6f0: 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74  ion to agree wit
f700: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a  h the restored.*
f710: 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  * page data..*/.
f720: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
f730: 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50  r_set_reiniter(P
f740: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
f750: 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f  id (*xReinit)(vo
f760: 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  id*,int)){.  pPa
f770: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
f780: 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a   xReinit;.}../*.
f790: 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20  ** Set the page 
f7a0: 73 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68  size.  Return th
f7b0: 65 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20  e new size.  If 
f7c0: 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20  the suggest new 
f7d0: 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20  page.** size is 
f7e0: 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74  inappropriate, t
f7f0: 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  hen an alternati
f800: 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ve page size is 
f810: 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20  selected.** and 
f820: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
f830: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
f840: 74 5f 70 61 67 65 73 69 7a 65 28 50 61 67 65 72  t_pagesize(Pager
f850: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61   *pPager, int pa
f860: 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  geSize){.  asser
f870: 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t( pageSize>=512
f880: 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
f890: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
f8a0: 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ZE );.  if( !pPa
f8b0: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
f8c0: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
f8d0: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
f8e0: 20 20 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f     sqlite3Reallo
f8f0: 63 4f 72 46 72 65 65 28 28 76 6f 69 64 20 2a 2a  cOrFree((void **
f900: 29 26 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  )&pPager->pTmpSp
f910: 61 63 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  ace, pageSize);.
f920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
f930: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  ger->pageSize;.}
f940: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
f950: 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
f960: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
f970: 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
f980: 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
f990: 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
f9a0: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
f9b0: 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
f9c0: 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
f9d0: 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
f9e0: 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
f9f0: 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
fa00: 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
fa10: 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
fa20: 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
fa30: 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
fa40: 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
fa50: 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
fa60: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
fa70: 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
fa80: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
fa90: 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
faa0: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
fab0: 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
fac0: 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
fad0: 3b 0a 76 6f 69 64 20 63 6c 65 61 72 5f 73 69 6d  ;.void clear_sim
fae0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28  ulated_io_error(
faf0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
fb00: 65 72 72 6f 72 5f 68 69 74 20 3d 20 30 3b 0a 7d  error_hit = 0;.}
fb10: 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
fb20: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
fb30: 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
fb40: 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
fb50: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
fb60: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
fb70: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
fb80: 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
fb90: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
fba0: 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
fbb0: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
fbc0: 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
fbd0: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
fbe0: 69 6e 65 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61  ine clear_simula
fbf0: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 0a 23  ted_io_error().#
fc00: 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
fc10: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
fc20: 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
fc30: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
fc40: 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
fc50: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
fc60: 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
fc70: 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
fc80: 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
fc90: 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
fca0: 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
fcb0: 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65   to. .**.** No e
fcc0: 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73  rror checking is
fcd0: 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f   done. The ratio
fce0: 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20  nal for this is 
fcf0: 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
fd00: 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61  on .** may be ca
fd10: 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  lled even if the
fd20: 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
fd30: 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20  xist or contain 
fd40: 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a  a header. In .**
fd50: 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c   these cases sql
fd60: 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c  ite3OsRead() wil
fd70: 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  l return an erro
fd80: 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  r, to which the 
fd90: 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70  correct .** resp
fda0: 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20  onse is to zero 
fdb0: 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44  the memory at pD
fdc0: 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  est and continue
fdd0: 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72  .  A real IO err
fde0: 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73  or .** will pres
fdf0: 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64  umably recur and
fe00: 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61   be picked up la
fe10: 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b  ter (Todo: Think
fe20: 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f   about this)..*/
fe30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
fe40: 72 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65  r_read_fileheade
fe50: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
fe60: 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
fe70: 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
fe80: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
fe90: 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
fea0: 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66  est, 0, N);.  if
feb0: 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20  ( MEMDB==0 ){.  
fec0: 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
fed0: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
fee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
fef0: 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ek(pPager->fd, 0
ff00: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
ff10: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
ff20: 73 28 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  s();.    IOTRACE
ff30: 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
ff40: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
ff50: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ff60: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
ff70: 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20  fd, pDest, N);. 
ff80: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ff90: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
ffa0: 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
ffb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
ffc0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
ffd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
ffe0: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
fff0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
10000 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
10010 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
10020 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   pPager. .**.** 
10030 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42  If the PENDING_B
10040 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20  YTE lies on the 
10050 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66  page directly af
10060 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
10070 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  he.** file, then
10080 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70   consider this p
10090 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  age part of the 
100a0 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78  file too. For ex
100b0 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e  ample, if.** PEN
100c0 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74  DING_BYTE is byt
100d0 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73  e 4096 (the firs
100e0 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35  t byte of page 5
100f0 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  ) and the size o
10100 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  f the.** file is
10110 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69   4096 bytes, 5 i
10120 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
10130 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20  ad of 4..*/.int 
10140 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
10150 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
10160 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
10170 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10180 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
10190 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
101a0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
101b0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
101c0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
101d0 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
101e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
101f0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66   } else {.    if
10200 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ( (rc = sqlite3O
10210 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
10220 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49  ->fd, &n))!=SQLI
10230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
10240 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
10250 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
10260 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
10270 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
10280 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10290 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
102a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
102b0 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
102c0 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
102d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
102e0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
102f0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
10300 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
10310 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
10320 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
10330 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10340 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
10350 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
10360 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10370 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
10380 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48  *.** Clear a PgH
10390 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a  istory block.*/.
103a0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
103b0 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f  rHistory(PgHisto
103c0 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71  ry *pHist){.  sq
103d0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
103e0 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
103f0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
10400 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
10410 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
10420 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65  >pStmt = 0;.}.#e
10430 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61  lse.#define clea
10440 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64  rHistory(x).#end
10450 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  if../*.** Forwar
10460 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
10470 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
10480 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
10490 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70  ../*.** Unlink p
104a0 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
104b0 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65  h chain. Also se
104c0 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
104d0 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61  r to 0 to indica
104e0 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  te.** that the p
104f0 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20  age is not part 
10500 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  of any hash chai
10510 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  n. This is requi
10520 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a  red because the.
10530 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
10540 6d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69  movepage() routi
10550 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70  ne can leave a p
10560 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70  age in the .** p
10570 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72  NextFree/pPrevFr
10580 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  ee list that is 
10590 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e  not a part of an
105a0 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f  y hash-chain..*/
105b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
105c0 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67  inkHashChain(Pag
105d0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
105e0 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
105f0 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
10600 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
10610 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
10620 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
10630 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
10640 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
10650 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
10660 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
10670 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
10680 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d  ->pPrevHash;.  }
10690 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
106a0 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73  vHash ){.    ass
106b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
106c0 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28  sh[pPg->pgno & (
106d0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
106e0 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]!=pPg );.    pP
106f0 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
10700 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
10710 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73  NextHash;.  }els
10720 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70  e{.    int h = p
10730 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
10740 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
10750 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
10760 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  h] = pPg->pNextH
10770 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  ash;.  }.  if( M
10780 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61  EMDB ){.    clea
10790 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54  rHistory(PGHDR_T
107a0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
107b0 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  er));.  }.  pPg-
107c0 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67  >pgno = 0;.  pPg
107d0 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
107e0 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
107f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
10800 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  k a page from th
10810 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65  e free list (the
10820 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
10830 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
10840 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74  ).** and from it
10850 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  s hash collision
10860 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   chain..*/.stati
10870 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67  c void unlinkPag
10880 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
10890 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
108a0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
108b0 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69   /* Keep the pFi
108c0 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65  rstSynced pointe
108d0 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  r pointing at th
108e0 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e  e first synchron
108f0 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ized page */.  i
10900 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
10910 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
10920 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
10930 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
10940 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
10950 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
10960 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
10970 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
10980 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
10990 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
109a0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
109b0 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  st */.  if( pPg-
109c0 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
109d0 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
109e0 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
109f0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10a00 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
10a10 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
10a20 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
10a30 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
10a40 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
10a50 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
10a60 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70  extFree ){.    p
10a70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
10a80 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
10a90 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c  pPrevFree;.  }el
10aa0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
10ab0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70  pPager->pLast==p
10ac0 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
10ad0 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
10ae0 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20  PrevFree;.  }.  
10af0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
10b00 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
10b10 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  = 0;..  /* Unlin
10b20 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20  k from the pgno 
10b30 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
10b40 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
10b50 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a  pPager, pPg);.}.
10b60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10b70 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
10b80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10b90 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e   is used to trun
10ba0 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  cate an in-memor
10bb0 79 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c  y database.  Del
10bc0 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73  ete.** all pages
10bd0 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c   whose pgno is l
10be0 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
10bf0 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73  r->dbSize and is
10c00 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a   unreferenced..*
10c10 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67  * Referenced pag
10c20 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  es larger than p
10c30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72  Pager->dbSize ar
10c40 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61  e zeroed..*/.sta
10c50 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54  tic void memoryT
10c60 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
10c70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
10c80 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a  *pPg;.  PgHdr **
10c90 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69  ppPg;.  int dbSi
10ca0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
10cb0 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26  ize;..  ppPg = &
10cc0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
10cd0 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70  while( (pPg = *p
10ce0 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  pPg)!=0 ){.    i
10cf0 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62  f( pPg->pgno<=db
10d00 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70  Size ){.      pp
10d10 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
10d20 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  All;.    }else i
10d30 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  f( pPg->nRef>0 )
10d40 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
10d50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
10d60 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
10d70 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
10d80 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
10d90 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tAll;.    }else{
10da0 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70  .      *ppPg = p
10db0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
10dc0 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70      unlinkPage(p
10dd0 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43  Pg);.      makeC
10de0 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20  lean(pPg);.     
10df0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
10e00 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
10e10 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
10e20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69   }.}.#else.#defi
10e30 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74  ne memoryTruncat
10e40 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e(p).#endif../*.
10e50 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
10e60 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c   a lock on a fil
10e70 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  e.  Invoke the b
10e80 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
10e90 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63  the lock.** is c
10ea0 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
10eb0 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20  ilable.  Repeat 
10ec0 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
10ed0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a  allback returns.
10ee0 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ** false or unti
10ef0 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  l the lock succe
10f00 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
10f10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
10f20 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
10f30 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
10f40 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
10f50 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
10f60 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
10f70 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
10f80 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
10f90 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
10fa0 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20  c;..  /* The OS 
10fb0 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74  lock values must
10fc0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
10fd0 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76  the Pager lock v
10fe0 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  alues */.  asser
10ff0 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d  t( PAGER_SHARED=
11000 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
11010 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
11020 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56  RESERVED==RESERV
11030 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
11040 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55  ert( PAGER_EXCLU
11050 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f  SIVE==EXCLUSIVE_
11060 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
11070 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72   the file is cur
11080 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20  rently unlocked 
11090 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75  then the size mu
110a0 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f  st be unknown */
110b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
110c0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
110d0 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72  SHARED || pPager
110e0 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45  ->dbSize<0 || ME
110f0 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  MDB );..  if( pP
11100 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
11110 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
11120 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
11130 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
11140 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11150 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
11160 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
11170 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
11180 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71  QLITE_BUSY && sq
11190 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
111a0 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
111b0 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a  BusyHandler) );.
111c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
111d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
111e0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c  Pager->state = l
111f0 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
11200 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
11210 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
11220 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
11230 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
11250 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
11260 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
11270 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
11280 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
11290 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
112a0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
112b0 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
112c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
112d0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
112e0 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42  _SHARED || MEMDB
112f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67   );.  sqlite3pag
11300 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
11310 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
11320 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
11330 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
11340 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74  errCode;.    ret
11350 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
11360 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e  ( nPage>=(unsign
11370 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
11380 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
11390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
113a0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
113b0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
113c0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
113d0 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
113e0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
113f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11400 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
11410 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
11420 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11430 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
11440 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
11450 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
11460 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
11470 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
11480 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ing. */.  rc = p
11490 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
114a0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
114b0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  IVE_LOCK);.  if(
114c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
114d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
114e0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67  .  }..  rc = pag
114f0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
11500 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66  er, nPage);.  if
11510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11520 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
11530 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
11540 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11550 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
11560 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
11570 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
11580 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
11590 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
115a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
115b0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
115c0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
115d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
115e0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
115f0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
11600 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
11610 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
11620 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
11630 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
11640 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
11650 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
11660 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
11670 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
11680 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
11690 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
116a0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
116b0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
116c0 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
116d0 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
116e0 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
116f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
11700 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
11710 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
11720 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
11730 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
11740 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
11750 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
11760 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
11770 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
11780 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
11790 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
117a0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
117b0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
117c0 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  _close(Pager *pP
117d0 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53 51  ager){.#ifdef SQ
117e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
117f0 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
11800 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61  /* A malloc() ca
11810 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c  nnot fail in sql
11820 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
11830 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   as one or more 
11840 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d  calls to .  ** m
11850 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76  alloc() must hav
11860 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d  e already been m
11870 61 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65  ade by this thre
11880 61 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74  ad before it get
11890 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70  s.  ** to this p
118a0 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73  oint. This means
118b0 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20   the ThreadData 
118c0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61  must have been a
118d0 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79  llocated already
118e0 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68  .  ** so that Th
118f0 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20  readData.nAlloc 
11900 63 61 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  can be set..  */
11910 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  .  ThreadData *p
11920 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  Tsd = sqlite3Thr
11930 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73  eadData();.  ass
11940 65 72 74 28 20 70 50 61 67 65 72 20 29 3b 0a 20  ert( pPager );. 
11950 20 61 73 73 65 72 74 28 20 70 54 73 64 20 26 26   assert( pTsd &&
11960 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b   pTsd->nAlloc );
11970 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62  .#endif..  disab
11980 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
11990 65 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67  errors();.  pPag
119a0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
119b0 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
119c0 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65  Pager);.  enable
119d0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
119e0 72 6f 72 73 28 29 3b 0a 20 20 54 52 41 43 45 32  rors();.  TRACE2
119f0 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
11a00 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
11a10 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
11a20 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
11a30 29 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  )).  assert( pPa
11a40 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
11a50 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
11a60 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65  Open==0 && pPage
11a70 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20  r->stmtOpen==0) 
11a80 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
11a90 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
11aa0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11ab0 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
11ac0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
11ad0 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
11ae0 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50  urnal);.  if( pP
11af0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
11b00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11b10 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
11b20 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
11b30 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
11b40 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
11b50 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
11b60 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
11b70 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
11b80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
11b90 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
11ba0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11bb0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
11bc0 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
11bd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11be0 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
11bf0 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  AGEMENT.  /* Rem
11c00 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72  ove the pager fr
11c10 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  om the linked li
11c20 73 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61  st of pagers sta
11c30 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54  rting at .  ** T
11c40 68 72 65 61 64 44 61 74 61 2e 70 50 61 67 65 72  hreadData.pPager
11c50 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67   if memory-manag
11c60 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64  ement is enabled
11c70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
11c80 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65  ger==pTsd->pPage
11c90 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70  r ){.    pTsd->p
11ca0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  Pager = pPager->
11cb0 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
11cc0 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b      Pager *pTmp;
11cd0 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20  .    for(pTmp = 
11ce0 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54  pTsd->pPager; pT
11cf0 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65  mp->pNext!=pPage
11d00 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  r; pTmp=pTmp->pN
11d10 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d  ext){}.    pTmp-
11d20 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d  >pNext = pPager-
11d30 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64  >pNext;.  }.#end
11d40 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  if.  sqliteFree(
11d50 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
11d60 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
11d70 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
11d80 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
11d90 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
11da0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11db0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
11dc0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
11dd0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
11de0 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
11df0 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  te3pager_pagenum
11e00 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ber(void *pData)
11e10 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44  {.  PgHdr *p = D
11e20 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
11e30 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ta);.  return p-
11e40 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pgno;.}../*.** 
11e50 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
11e60 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
11e70 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
11e80 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
11e90 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
11ea0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
11eb0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
11ec0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
11ed0 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
11ee0 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
11ef0 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
11f00 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
11f10 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
11f20 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
11f30 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
11f40 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
11f50 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
11f60 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
11f70 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
11f80 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
11f90 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
11fa0 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
11fb0 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
11fc0 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
11fd0 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
11fe0 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
11ff0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
12000 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
12010 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
12020 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
12030 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
12040 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
12050 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d     if( pPg==pPg-
12060 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
12070 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ynced ){.      P
12080 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
12090 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
120a0 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
120b0 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
120c0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
120d0 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
120e0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
120f0 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   p;.    }.    if
12100 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
12110 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
12120 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
12130 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
12140 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
12150 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
12160 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
12170 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
12180 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
12190 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
121a0 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
121b0 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
121c0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
121d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
121e0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61  pPg->pPager->pLa
121f0 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
12200 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ree;.    }.    p
12210 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66  Pg->pPager->nRef
12220 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e  ++;.  }.  pPg->n
12230 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref++;.  REFINFO
12240 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20  (pPg);.}.#ifdef 
12250 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
12260 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
12270 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
12280 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
12290 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
122a0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
122b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
122c0 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
122d0 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
122e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
122f0 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
12300 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
12310 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
12320 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
12330 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
12340 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
12350 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
12360 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
12370 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
12380 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
12390 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
123a0 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
123b0 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69  te3pager_ref(voi
123c0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
123d0 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
123e0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
123f0 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
12400 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12410 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
12420 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
12430 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12440 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
12450 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
12460 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
12470 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
12480 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
12490 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
124a0 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
124b0 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
124c0 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
124d0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
124e0 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
124f0 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
12500 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
12510 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
12520 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
12530 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
12540 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
12550 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
12560 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
12570 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
12580 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
12590 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
125a0 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
125b0 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
125c0 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
125d0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
125e0 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
125f0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
12600 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
12610 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
12620 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
12630 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
12640 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
12650 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
12660 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
12670 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
12680 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
12690 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
126a0 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
126b0 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
126c0 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
126d0 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
126e0 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
126f0 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
12700 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
12710 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
12720 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
12730 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
12740 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
12750 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
12760 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
12770 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
12780 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
12790 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
127a0 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
127b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
127c0 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
127d0 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
127e0 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
127f0 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
12800 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
12810 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
12820 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
12830 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
12840 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12850 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
12860 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
12870 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
12880 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
12890 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
128a0 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
128b0 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
128c0 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
128d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
128e0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
128f0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
12900 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
12910 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
12920 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
12930 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
12940 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
12950 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
12960 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
12970 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
12980 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
12990 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
129a0 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
129b0 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
129c0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
129d0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
129e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
129f0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
12a00 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
12a10 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
12a20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
12a30 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
12a40 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
12a50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
12a60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
12a70 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
12a80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12a90 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
12aa0 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
12ab0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
12ac0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
12ad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12ae0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12af0 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
12b00 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  }.#endif.      {
12b10 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
12b20 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
12b30 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
12b40 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
12b50 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
12b60 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
12b70 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
12b80 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
12b90 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
12ba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
12bb0 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
12bc0 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
12bd0 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
12be0 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
12bf0 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
12c00 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
12c10 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20  lback. .        
12c20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
12c30 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
12c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  ){.          TRA
12c50 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
12c60 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
12c70 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
12c80 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
12c90 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
12ca0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
12cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12cc0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
12cd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
12ce0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
12cf0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
12d00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12d10 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
12d20 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20  er->jfd,.       
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
12d50 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
12d60 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
12d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
12d80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12d90 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
12da0 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
12db0 22 2c 20 70 50 61 67 65 72 2c 0a 20 20 20 20 20  ", pPager,.     
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
12dd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
12de0 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
12df0 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a 20 20 20  lMagic), 4)).   
12e00 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
12e10 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
12e20 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  d, pPager->nRec)
12e30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12e40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
12e50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12e60 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
12e70 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
12e80 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
12e90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
12ea0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
12eb0 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59        TRACE2("SY
12ec0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
12ed0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
12ee0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
12ef0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 64 5c  RACE(("JSYNC %d\
12f00 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
12f10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12f20 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
12f30 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
12f40 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  fsync);.      if
12f50 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
12f60 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
12f70 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
12f80 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
12f90 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
12fa0 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
12fb0 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
12fc0 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
12fd0 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
12fe0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
12ff0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
13000 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
13010 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
13020 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
13030 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
13040 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
13050 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  er->pFirst;.  }.
13060 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13070 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65    /* If the Page
13080 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
13090 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68  is clear then th
130a0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
130b0 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20  .  ** flag must 
130c0 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f  also be clear fo
130d0 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65  r all pages.  Ve
130e0 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20  rify that this. 
130f0 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73   ** invariant is
13100 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c   true..  */.  el
13110 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  se{.    for(pPg=
13120 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
13130 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
13140 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73  tAll){.      ass
13150 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
13160 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  nc==0 );.    }. 
13170 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13180 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
13190 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  =pPager->pFirst 
131a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
131b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
131c0 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c  *.** Merge two l
131d0 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f  ists of pages co
131e0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
131f0 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72  y and in pgno or
13200 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62  der..** Do not b
13210 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70  oth fixing the p
13220 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
13230 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  rs..*/.static Pg
13240 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c  Hdr *merge_pagel
13250 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50  ist(PgHdr *pA, P
13260 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48  gHdr *pB){.  PgH
13270 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69  dr result, *pTai
13280 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65  l;.  pTail = &re
13290 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  sult;.  while( p
132a0 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69  A && pB ){.    i
132b0 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e  f( pA->pgno<pB->
132c0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54  pgno ){.      pT
132d0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41  ail->pDirty = pA
132e0 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
132f0 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70  pA;.      pA = p
13300 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  A->pDirty;.    }
13310 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69  else{.      pTai
13320 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
13330 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42        pTail = pB
13340 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d  ;.      pB = pB-
13350 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
13360 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20   }.  if( pA ){. 
13370 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13380 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69   = pA;.  }else i
13390 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61  f( pB ){.    pTa
133a0 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
133b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
133c0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ail->pDirty = 0;
133d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
133e0 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a  sult.pDirty;.}..
133f0 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c  /*.** Sort the l
13400 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
13410 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
13420 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20  by pgno.  Pages 
13430 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  are.** connected
13440 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74   by pDirty point
13450 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44  ers.  The pPrevD
13460 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72  irty pointers ar
13470 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62  e.** corrupted b
13480 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a  y this sort..*/.
13490 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
134a0 55 43 4b 45 54 20 32 35 0a 73 74 61 74 69 63 20  UCKET 25.static 
134b0 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65  PgHdr *sort_page
134c0 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29  list(PgHdr *pIn)
134d0 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53  {.  PgHdr *a[N_S
134e0 4f 52 54 5f 42 55 43 4b 45 54 5d 2c 20 2a 70 3b  ORT_BUCKET], *p;
134f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73  .  int i;.  mems
13500 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(a, 0, sizeof(
13510 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  a));.  while( pI
13520 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e  n ){.    p = pIn
13530 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70  ;.    pIn = p->p
13540 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
13550 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f  irty = 0;.    fo
13560 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f  r(i=0; i<N_SORT_
13570 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a  BUCKET-1; i++){.
13580 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d        if( a[i]==
13590 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69  0 ){.        a[i
135a0 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62  ] = p;.        b
135b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
135c0 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d  e{.        p = m
135d0 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
135e0 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  i], p);.        
135f0 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  a[i] = 0;.      
13600 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13610 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  i==N_SORT_BUCKET
13620 2d 31 20 29 7b 0a 20 20 20 20 20 20 61 5b 69 5d  -1 ){.      a[i]
13630 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
13640 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20  t(a[i], p);.    
13650 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d  }.  }.  p = a[0]
13660 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e  ;.  for(i=1; i<N
13670 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b  _SORT_BUCKET; i+
13680 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67  +){.    p = merg
13690 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b  e_pagelist(p, a[
136a0 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  i]);.  }.  retur
136b0 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
136c0 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
136d0 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
136e0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
136f0 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
13700 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
13710 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
13720 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
13730 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20  e file and mark 
13740 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63  them all.** as c
13750 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
13760 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
13770 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
13780 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
13790 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
137a0 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
137b0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
137c0 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
137d0 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
137e0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
137f0 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
13800 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
13810 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
13820 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
13830 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
13840 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
13850 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
13860 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
13870 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
13880 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
13890 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
138a0 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
138b0 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
138c0 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
138d0 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
138e0 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
138f0 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
13900 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
13910 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
13920 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
13930 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
13940 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
13950 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
13960 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
13970 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
13980 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
13990 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
139a0 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
139b0 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
139c0 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
139d0 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
139e0 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
139f0 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
13a00 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
13a10 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
13a20 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
13a30 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
13a40 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
13a50 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
13a60 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
13a70 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
13a80 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
13a90 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
13aa0 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
13ab0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
13ac0 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
13ad0 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
13ae0 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
13af0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
13b00 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
13b10 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
13b20 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
13b30 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
13b40 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
13b50 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
13b60 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
13b70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
13b80 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
13b90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13ba0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13bb0 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72  }..  pList = sor
13bc0 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74  t_pagelist(pList
13bd0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
13be0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
13bf0 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
13c00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13c10 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
13c20 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
13c30 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
13c40 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
13c50 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
13c60 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  rc;.    /* If th
13c70 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
13c80 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
13c90 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
13ca0 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
13cb0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
13cc0 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
13cd0 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67 65  eans sqlite3page
13ce0 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61 73  r_truncate() was
13cf0 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
13d00 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
13d10 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
13d20 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
13d30 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
13d40 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
13d50 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
13d60 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  the file..    */
13d70 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
13d80 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
13d90 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Size ){.      ch
13da0 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45  ar *pData = CODE
13db0 43 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C2(pPager, PGHDR
13dc0 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
13dd0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
13de0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  ;.      TRACE3("
13df0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
13e00 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13e10 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
13e20 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  o);.      IOTRAC
13e30 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
13e40 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
13e50 74 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20  t->pgno)).      
13e60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
13e70 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
13e80 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
13e90 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
13ea0 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
13eb0 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d  ->nWrite);.    }
13ec0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13ed0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
13ee0 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20  TRACE3("NOSTORE 
13ef0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
13f00 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
13f10 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
13f20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
13f30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13f40 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69  c;.    pList->di
13f50 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  rty = 0;.#ifdef 
13f60 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
13f70 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61  ES.    pList->pa
13f80 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
13f90 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
13fa0 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74  #endif.    pList
13fb0 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
13fc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
13fd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13fe0 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79  ** Collect every
13ff0 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f   dirty page into
14000 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e   a dirty list an
14010 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f  d.** return a po
14020 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
14030 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20  d of that list. 
14040 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a   All pages are.*
14050 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e  * collected even
14060 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69   if they are sti
14070 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  ll in use..*/.st
14080 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
14090 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
140a0 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61  pages(Pager *pPa
140b0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
140c0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d  Pager->pDirty;.}
140d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
140e0 52 55 45 20 69 66 20 74 68 65 72 65 20 69 73 20  RUE if there is 
140f0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e  a hot journal on
14100 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
14110 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ..** A hot journ
14120 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e  al is one that n
14130 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
14140 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d back..**.** If
14150 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
14160 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
14170 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
14180 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
14190 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
141a0 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
141b0 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
141c0 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
141d0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
141e0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
141f0 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68    Just delete th
14200 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  e journal..*/.st
14210 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
14220 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
14230 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
14240 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
14250 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14260 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  f( !sqlite3OsFil
14270 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  eExists(pPager->
14280 7a 4a 6f 75 72 6e 61 6c 29 20 29 20 72 65 74 75  zJournal) ) retu
14290 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
142a0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
142b0 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
142c0 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  d) ) return 0;. 
142d0 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65   if( sqlite3page
142e0 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
142f0 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  er)==0 ){.    sq
14300 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
14310 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
14320 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
14330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
14340 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
14350 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  ** Try to find a
14360 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
14370 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  he that can be r
14380 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  ecycled. .**.** 
14390 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
143a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
143b0 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c  OERR, SQLITE_FUL
143c0 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  L or SQLITE_OK. 
143d0 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  It .** does not 
143e0 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e  set the pPager->
143f0 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
14400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14410 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61  pager_recycle(Pa
14420 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14430 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a   syncOk, PgHdr *
14440 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20  *ppPg){.  PgHdr 
14450 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20  *pPg;.  *ppPg = 
14460 30 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20  0;..  /* Find a 
14470 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e  page to recycle.
14480 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20    Try to locate 
14490 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
144a0 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72   not.  ** requir
144b0 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73  e us to do an fs
144c0 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75  ync() on the jou
144d0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  rnal..  */.  pPg
144e0 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
144f0 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49  tSynced;..  /* I
14500 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66  f we could not f
14510 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20  ind a page that 
14520 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
14530 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a   an fsync().  **
14540 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
14550 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20  file then fsync 
14560 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14570 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a  .  This is a.  *
14580 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72  * very slow oper
14590 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72  ation, so we wor
145a0 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20  k hard to avoid 
145b0 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d  it.  But sometim
145c0 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74  es.  ** it can't
145d0 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f   be helped..  */
145e0 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26  .  if( pPg==0 &&
145f0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
14600 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45  && syncOk && !ME
14610 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  MDB){.    int rc
14620 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
14630 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
14640 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  rc!=0 ){.      r
14650 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
14660 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14670 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
14680 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
14690 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65  sync mode, write
146a0 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68   a new journal h
146b0 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  eader into the. 
146c0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
146d0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
146e0 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
146f0 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
14700 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65  rnal.      ** he
14710 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76  ader that is inv
14720 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  olved in the rol
14730 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74  lback of pages t
14740 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a  hat have.      *
14750 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  * already been w
14760 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
14770 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20  tabase (in case 
14780 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20  the header is.  
14790 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77      ** trashed w
147a0 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
147b0 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
147c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
147d0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
147e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
147f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14800 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61  f > 0 );.      a
14810 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
14820 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
14830 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
14840 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
14850 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14860 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
14870 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
14880 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
14890 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
148a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
148b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
148c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
148d0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
148e0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
148f0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
14900 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
14910 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
14920 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ty..  */.  if( p
14930 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
14940 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
14950 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
14960 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b  nc==0 );.    mak
14970 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
14980 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
14990 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
149a0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
149b0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
149c0 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
149d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
149e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
149f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
14a00 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
14a10 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  irty==0 );..  /*
14a20 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20   If the page we 
14a30 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73  are recycling is
14a40 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
14a50 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a  sRollback, then.
14a60 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f    ** set the glo
14a70 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  bal alwaysRollba
14a80 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69  ck flag, thus di
14a90 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a  sabling the.  **
14aa0 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c   sqlite_dont_rol
14ab0 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61  lback() optimiza
14ac0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73  tion for the res
14ad0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
14ae0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69  ction..  ** It i
14af0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
14b00 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
14b10 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
14b20 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
14b30 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f  ** might be relo
14b40 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20  aded at a later 
14b50 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74  time but at that
14b60 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20   point we won't 
14b70 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
14b80 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64  at is was marked
14b90 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e   alwaysRollback.
14ba0 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
14bb0 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  t all pages must
14bc0 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20  .  ** be marked 
14bd0 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
14be0 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f  k from here on o
14bf0 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ut..  */.  if( p
14c00 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
14c10 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ck ){.    IOTRAC
14c20 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42  E(("ALWAYS_ROLLB
14c30 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  ACK %p\n", pPage
14c40 72 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r)).    pPager->
14c50 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
14c60 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   1;.  }..  /* Un
14c70 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
14c80 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
14c90 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
14ca0 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75  h table.  */.  u
14cb0 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
14cc0 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
14cd0 65 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a  er->nOvfl);..  *
14ce0 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
14cf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14d00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
14d10 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
14d20 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c   to free superfl
14d30 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  uous dynamically
14d40 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
14d50 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65  y.** held by the
14d60 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d   pager system. M
14d70 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
14d80 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72  any SQLite pager
14d90 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
14da0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
14db0 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74  ead may be sqlit
14dc0 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a  eFree()ed..**.**
14dd0 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d   nReq is the num
14de0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
14df0 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e  memory required.
14e00 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20   Once this much 
14e10 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65  has.** been rele
14e20 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  ased, the functi
14e30 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65  on returns. A ne
14e40 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72  gative value for
14e50 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66   nReq means.** f
14e60 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
14e70 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20  ry as possible. 
14e80 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
14e90 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
14ea0 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65  mber .** of byte
14eb0 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
14ec0 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ased..*/.#ifdef 
14ed0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
14ee0 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
14ef0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
14f00 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
14f10 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e  int nReq){.  con
14f20 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  st ThreadData *p
14f30 54 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54  Tsdro = sqlite3T
14f40 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
14f50 79 28 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b  y();.  Pager *p;
14f60 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64  .  int nReleased
14f70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a   = 0;.  int i;..
14f80 20 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20    /* If the the 
14f90 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
14fa0 68 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f  held, this subro
14fb0 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a  utine becomes a.
14fc0 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20    ** o-op; zero 
14fd0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
14fe0 61 72 65 20 66 72 65 65 64 2e 20 20 54 68 69 73  are freed.  This
14ff0 20 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a   is because.  **
15000 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64   some of the cod
15010 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69  e invoked by thi
15020 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
15030 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20  lso.  ** try to 
15040 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78  obtain the mutex
15050 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  , resulting in a
15060 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   deadlock..  */.
15070 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49    if( sqlite3OsI
15080 6e 4d 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20  nMutex(0) ){.   
15090 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
150a0 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c    /* Outermost l
150b0 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20  oop runs for at 
150c0 6d 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74 69  most two iterati
150d0 6f 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72 61  ons. First itera
150e0 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79  tion we.  ** try
150f0 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20   to find memory 
15100 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65  that can be rele
15110 61 73 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c  ased without cal
15120 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65  ling fsync(). Se
15130 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74  cond.  ** iterat
15140 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20  ion (which only 
15150 72 75 6e 73 20 69 66 20 74 68 65 20 66 69 72 73  runs if the firs
15160 74 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65  t failed to free
15170 20 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20   nReq bytes of. 
15180 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70   ** memory) is p
15190 65 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c  ermitted to call
151a0 20 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69   fsync(). This i
151b0 73 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68  s of course much
151c0 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65   more .  ** expe
151d0 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nsive..  */.  fo
151e0 72 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b  r(i=0; i<=1; i++
151f0 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ){..    /* Loop 
15200 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20  through all the 
15210 53 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70  SQLite pagers op
15220 65 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  ened by the curr
15230 65 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20  ent thread. */. 
15240 20 20 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d     for(p=pTsdro-
15250 3e 70 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e  >pPager; p && (n
15260 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73  Req<0 || nReleas
15270 65 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70  ed<nReq); p=p->p
15280 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48  Next){.      PgH
15290 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69  dr *pPg;.      i
152a0 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt rc;..      /*
152b0 20 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c   For each pager,
152c0 20 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20   try to free as 
152d0 6d 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f  many pages as po
152e0 73 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20  ssible (without 
152f0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e  .      ** callin
15300 67 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69  g fsync() if thi
15310 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  s is the first i
15320 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
15330 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20  outermost .     
15340 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20   ** loop)..     
15350 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
15360 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
15370 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
15380 70 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20  p, i, &pPg)) && 
15390 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  pPg) {.        /
153a0 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20  * We've found a 
153b0 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74  page to free. At
153c0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
153d0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20  page has been . 
153e0 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65         ** remove
153f0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  d from the page 
15400 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65  hash-table, free
15410 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64  -list and synced
15420 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a  -list .        *
15430 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29  * (pFirstSynced)
15440 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e  . It is still in
15450 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28   the all pages (
15460 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20  pAll) list. .   
15470 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69       ** Remove i
15480 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74  t from this list
15490 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e   before freeing.
154a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
154b0 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65      ** Todo: Che
154c0 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74  ck the Pager.pSt
154d0 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20  mt list to make 
154e0 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e  sure this is Ok.
154f0 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   It .        ** 
15500 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75  probably is thou
15510 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  gh..        */. 
15520 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54         PgHdr *pT
15530 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mp;.        asse
15540 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  rt( pPg );.     
15550 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66     page_remove_f
15560 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  rom_stmt_list(pP
15570 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g);.        if( 
15580 70 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a  pPg==p->pAll ){.
15590 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41             p->pA
155a0 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
155b0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
155c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  e{.          for
155d0 28 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20  ( pTmp=p->pAll; 
155e0 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d  pTmp->pNextAll!=
155f0 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e  pPg; pTmp=pTmp->
15600 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20  pNextAll ){}.   
15610 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65         pTmp->pNe
15620 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65  xtAll = pPg->pNe
15630 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  xtAll;.        }
15640 0a 20 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73  .        nReleas
15650 65 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f  ed += sqliteAllo
15660 63 53 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20  cSize(pPg);.    
15670 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
15680 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  Pg);.      }..  
15690 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
156a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
156b0 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   /* An error occ
156c0 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  ured whilst writ
156d0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
156e0 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20  ase file or .   
156f0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
15700 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65  in pager_recycle
15710 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73  (). The error is
15720 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f   not returned to
15730 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
15740 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20   caller of this 
15750 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  function. Instea
15760 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  d, set the Pager
15770 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  .errCode variabl
15780 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  e..        ** Th
15790 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
157a0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
157b0 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20  user (or users, 
157c0 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20  in the case .   
157d0 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61       ** of a sha
157e0 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29  red pager cache)
157f0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f   of the pager fo
15800 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f  r which the erro
15810 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20  r occured..     
15820 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
15830 73 65 72 74 28 20 28 72 63 26 30 78 66 66 29 3d  sert( (rc&0xff)=
15840 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
15850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c   rc==SQLITE_FULL
15860 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
15870 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41  rt( p->state>=PA
15880 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
15890 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
158a0 72 6f 72 28 70 2c 20 72 63 29 3b 0a 20 20 20 20  ror(p, rc);.    
158b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
158c0 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65   return nRelease
158d0 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
158e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
158f0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a  ORY_MANAGEMENT *
15900 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  /../*.** Acquire
15910 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
15920 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
15930 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
15940 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
15950 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
15960 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
15970 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
15980 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
15990 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
159a0 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f  eased..**.** A _
159b0 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  get works for an
159c0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
159d0 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
159e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
159f0 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
15a00 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
15a10 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
15a20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
15a30 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
15a40 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
15a50 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
15a60 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
15a70 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
15a80 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
15a90 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
15aa0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
15ab0 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
15ac0 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
15ad0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
15ae0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
15af0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
15b00 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
15b10 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
15b20 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
15b30 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
15b40 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
15b50 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
15b60 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
15b70 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
15b80 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
15b90 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e  3pager_lookup().
15ba0 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
15bb0 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28  ine and _lookup(
15bc0 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
15bd0 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
15be0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
15bf0 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
15c00 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
15c10 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
15c20 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
15c30 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
15c40 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
15c50 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a  eas _lookup().**
15c60 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
15c70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
15c80 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
15c90 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
15ca0 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
15cb0 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
15cc0 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
15cd0 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
15ce0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
15cf0 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75  .** Since _looku
15d00 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
15d10 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
15d20 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
15d30 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
15d40 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
15d50 2a 2a 20 49 66 20 63 6c 72 46 6c 61 67 20 69 73  ** If clrFlag is
15d60 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65   false, the page
15d70 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63   contents are ac
15d80 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
15d90 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 63 6c 66   disk..** If clf
15da0 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 69 74  Flag is true, it
15db0 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
15dc0 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 65  is about to be e
15dd0 72 61 73 65 64 20 61 6e 64 0a 2a 2a 20 72 65 77  rased and.** rew
15de0 72 69 74 74 65 6e 20 77 69 74 68 6f 75 74 20 66  ritten without f
15df0 69 72 73 74 20 62 65 69 6e 67 20 72 65 61 64 20  irst being read 
15e00 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  so there is no p
15e10 6f 69 6e 74 20 69 74 20 64 6f 69 6e 67 0a 2a 2a  oint it doing.**
15e20 20 74 68 65 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a   the disk I/O..*
15e30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
15e40 65 72 5f 61 63 71 75 69 72 65 28 50 61 67 65 72  er_acquire(Pager
15e50 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
15e60 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61  gno, void **ppPa
15e70 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67 29  ge, int clrFlag)
15e80 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
15e90 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
15ea0 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
15eb0 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
15ec0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
15ed0 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
15ee0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65  .  ** number gre
15ef0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
15f00 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75  or zero, is requ
15f10 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ested..  */.  if
15f20 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
15f30 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30  _PGNO || pgno==0
15f40 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
15f50 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
15f60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15f70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
15f80 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  T;.  }..  /* Mak
15f90 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
15fa0 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
15fb0 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
15fc0 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67   .  assert( pPag
15fd0 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  er!=0 );.  *ppPa
15fe0 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
15ff0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
16000 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
16010 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
16020 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
16030 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
16040 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
16050 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
16060 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20   accessed, then 
16070 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63  get a SHARED loc
16080 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61  k.  ** on the da
16090 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
160a0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
160b0 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44  nRef==0 && !MEMD
160c0 42 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  B ){.    if( !pP
160d0 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
160e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
160f0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
16100 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
16110 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
16120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16130 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
16140 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
16150 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
16160 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
16170 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
16180 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
16190 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
161a0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
161b0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
161c0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
161d0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
161e0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
161f0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
16200 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f      if( hasHotJo
16210 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b  urnal(pPager) ){
16220 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  .       /* Get a
16230 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16240 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16250 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
16260 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
16270 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
16280 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
16290 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
162a0 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
162b0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  o the.       ** 
162c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
162d0 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
162e0 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
162f0 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
16300 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
16310 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
16320 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
16330 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
16340 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61  the.       ** da
16350 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
16360 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
16370 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
16380 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20  ll rolling it . 
16390 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
163a0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
163b0 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
163c0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
163d0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
163e0 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  t requested, the
163f0 0a 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  .       ** secon
16400 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
16410 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
16420 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
16430 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
16440 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f  ** obtain it's o
16450 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
16460 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
16470 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a  e file..       *
16480 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
16490 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
164a0 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
164b0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
164c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
164d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 61  K ){.         pa
164e0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
164f0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  r);.         ret
16500 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
16510 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
16530 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
16540 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20  ER_EXCLUSIVE;.. 
16550 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
16560 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
16570 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74  ading only.  Ret
16580 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
16590 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20  if.       ** we 
165a0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70  are unable to op
165b0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
165c0 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a  ile. .       **.
165d0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f         ** The jo
165e0 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
165f0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
16600 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54  ocked itself.  T
16610 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he.       ** jou
16620 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
16630 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
16640 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
16650 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
16660 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f     ** a write lo
16670 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ck, so there is 
16680 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65  never any chance
16690 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
166a0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
166b0 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
166c0 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
166d0 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
166e0 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
166f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
16700 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a  dOnly(pPager->zJ
16710 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
16720 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66  >jfd);.       if
16730 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16740 29 7b 0a 20 20 20 20 20 20 20 20 20 70 61 67 65  ){.         page
16750 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
16760 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
16770 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
16780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70        }.       p
16790 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
167a0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70  en = 1;.       p
167b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
167c0 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
167d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
167e0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
167f0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
16800 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  er = 0;.       p
16810 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
16820 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f  r = 0;..       /
16830 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
16840 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
16850 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
16860 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
16870 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
16880 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
16890 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a  d lock..       *
168a0 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  /.       rc = pa
168b0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
168c0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28  ger);.       if(
168d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
168e0 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  {.         retur
168f0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
16900 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
16910 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
16920 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
16930 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
16940 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  r page in cache 
16950 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
16960 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
16970 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
16980 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72   MEMDB && pPager
16990 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
169a0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
169b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
169c0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
169d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67   }.  }.  if( pPg
169e0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
169f0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
16a00 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70   is not in the p
16a10 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
16a20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53    int h;.    TES
16a30 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
16a40 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70  Miss);.    if( p
16a50 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61  Pager->nPage<pPa
16a60 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70  ger->mxPage || p
16a70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30  Pager->pFirst==0
16a80 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 0a 20 20 20   || MEMDB ||.   
16a90 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 70 46       (pPager->pF
16aa0 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26  irstSynced==0 &&
16ab0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
16ac0 6e 63 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  nc).    ){.     
16ad0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
16ae0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
16af0 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
16b00 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20  >=pPager->nHash 
16b10 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
16b20 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
16b30 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20  le(pPager,.     
16b40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48        pPager->nH
16b50 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20  ash<256 ? 256 : 
16b60 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29  pPager->nHash*2)
16b70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
16b80 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29  ager->nHash==0 )
16b90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
16ba0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16bb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16bc0 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73   }.      pPg = s
16bd0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
16be0 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70  sizeof(*pPg) + p
16bf0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a  Pager->pageSize.
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
16c20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50  sizeof(u32) + pP
16c30 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20  ager->nExtra.   
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c50 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d             + MEM
16c60 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74  DB*sizeof(PgHist
16c70 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ory) );.      if
16c80 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
16c90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16ca0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
16cb0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
16cc0 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
16cd0 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  g));.      if( M
16ce0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
16cf0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
16d00 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
16d10 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48  ), 0, sizeof(PgH
16d20 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20  istory));.      
16d30 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
16d40 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
16d50 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c      pPg->pNextAl
16d60 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  l = pPager->pAll
16d70 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
16d80 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
16d90 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
16da0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  +;.      if( pPa
16db0 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65  ger->nPage>pPage
16dc0 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20  r->nMaxPage ){. 
16dd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16de0 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d  Pager->nMaxPage=
16df0 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d  =(pPager->nPage-
16e00 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  1) );.        pP
16e10 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b  ager->nMaxPage++
16e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16e30 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
16e40 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
16e50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a  ager, 1, &pPg);.
16e60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16e80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16e90 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
16ea0 72 74 28 70 50 67 29 20 3b 0a 20 20 20 20 7d 0a  rt(pPg) ;.    }.
16eb0 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
16ec0 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50  pgno;.    if( pP
16ed0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
16ee0 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
16ef0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
16f00 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
16f10 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50  e3CheckMemory(pP
16f20 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
16f30 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20  , pgno/8);.     
16f40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16f50 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
16f60 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
16f70 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e  rnal = (pPager->
16f80 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
16f90 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
16fa0 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50  )))!=0;.      pP
16fb0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
16fc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16fd0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
16fe0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
16ff0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
17000 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
17010 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20  ger->aInStmt && 
17020 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
17030 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20  r->stmtSize.    
17040 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
17050 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e  ger->aInStmt[pgn
17060 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
17070 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  &7)))!=0 ){.    
17080 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
17090 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
170a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
170b0 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
170c0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
170d0 20 20 20 20 7d 0a 20 20 20 20 6d 61 6b 65 43 6c      }.    makeCl
170e0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
170f0 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  g->nRef = 1;.   
17100 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
17110 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
17120 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
17130 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
17140 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
17150 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
17160 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
17170 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
17180 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
17190 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
171a0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
171b0 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
171c0 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
171d0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
171e0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72  errCode;.      r
171f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
17200 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
17210 20 74 68 65 20 70 61 67 65 20 77 69 74 68 20 64   the page with d
17220 61 74 61 2c 20 65 69 74 68 65 72 20 62 79 20 72  ata, either by r
17230 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
17240 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
17250 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74  file, or by sett
17260 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70  ing the entire p
17270 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20  age to zero..   
17280 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
17290 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
172a0 6e 74 28 70 50 61 67 65 72 29 3c 28 69 6e 74 29  nt(pPager)<(int)
172b0 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 0a 20 20  pgno || MEMDB.  
172c0 20 20 20 20 20 20 20 7c 7c 20 28 63 6c 72 46 6c         || (clrFl
172d0 61 67 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61  ag && !pPager->a
172e0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 0a  lwaysRollback) .
172f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d      ){.      mem
17300 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
17310 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
17320 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
17340 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20  ssert( MEMDB==0 
17350 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
17360 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
17370 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
17380 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
17390 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
173a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
173b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
173c0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
173d0 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
173e0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20  _TO_DATA(pPg),. 
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
17410 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f        }.      IO
17430 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
17440 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
17450 67 6e 6f 29 29 0a 20 20 20 20 20 20 54 52 41 43  gno)).      TRAC
17460 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E3("FETCH %d pag
17470 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
17480 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
17490 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  gno);.      CODE
174a0 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C1(pPager, PGHDR
174b0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
174c0 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
174d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
174e0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
174f0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
17500 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
17510 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
17520 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
17530 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f  ger_unref(PGHDR_
17540 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20  TO_DATA(pPg));. 
17550 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17560 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17570 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52         TEST_INCR
17580 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
17590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
175a0 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20      /* Link the 
175b0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
175c0 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  ge hash table */
175d0 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  .    h = pgno & 
175e0 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
175f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17600 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  gno!=0 );.    pP
17610 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
17620 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
17630 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
17640 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
17650 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
17660 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ash ){.      ass
17670 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
17680 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  ash->pPrevHash==
17690 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  0 );.      pPg->
176a0 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
176b0 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
176c0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
176d0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
176e0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
176f0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
17700 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
17710 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
17720 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
17730 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
17740 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53  ache. */.    TES
17750 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
17760 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72  Hit);.    page_r
17770 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
17780 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54  ppPage = PGHDR_T
17790 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72  O_DATA(pPg);.  r
177a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
177b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
177c0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
177d0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
177e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
177f0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
17800 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
17810 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
17820 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
17830 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
17840 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
17850 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
17860 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
17870 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68  pager_get().  Th
17880 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
17890 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
178a0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
178b0 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74  pager_get() is t
178c0 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
178d0 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
178e0 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
178f0 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
17900 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
17910 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
17920 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
17930 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
17940 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
17950 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
17960 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
17970 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
17980 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
17990 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
179a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
179b0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
179c0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
179d0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
179e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
179f0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
17a00 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
17a10 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
17a20 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
17a30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17a40 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
17a50 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
17a60 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
17a70 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17a80 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
17a90 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54    return PGHDR_T
17aa0 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a  O_DATA(pPg);.}..
17ab0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
17ac0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
17ad0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
17ae0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
17af0 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
17b00 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
17b10 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
17b20 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
17b30 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
17b40 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
17b50 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
17b60 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
17b70 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
17b80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
17b90 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
17ba0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
17bb0 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44  r_unref(void *pD
17bc0 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
17bd0 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d  Pg;..  /* Decrem
17be0 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
17bf0 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73  e count for this
17c00 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67   page.  */.  pPg
17c10 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
17c20 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
17c30 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
17c40 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pPg->nRef--;
17c50 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
17c60 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
17c70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  Pg);..  /* When 
17c80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
17c90 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61  ferences to a pa
17ca0 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c  ge reach 0, call
17cb0 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75   the.  ** destru
17cc0 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65  ctor and add the
17cd0 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
17ce0 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elist..  */.  if
17cf0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
17d00 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
17d10 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ger;.    pPager 
17d20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
17d30 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
17d40 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  e = 0;.    pPg->
17d50 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67  pPrevFree = pPag
17d60 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70  er->pLast;.    p
17d70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
17d80 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
17d90 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
17da0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
17db0 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
17dc0 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pPg;.    }else{.
17dd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
17de0 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  irst = pPg;.    
17df0 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
17e00 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50  eedSync==0 && pP
17e10 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
17e20 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ed==0 ){.      p
17e30 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
17e40 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ced = pPg;.    }
17e50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17e60 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
17e70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
17e80 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c  estructor(pData,
17e90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17ea0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
17eb0 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67   /* When all pag
17ec0 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65  es reach the fre
17ed0 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20  elist, drop the 
17ee0 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20  read lock from. 
17ef0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
17f00 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
17f10 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
17f20 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
17f30 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20  pPager->nRef>=0 
17f40 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
17f50 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d  r->nRef==0 && !M
17f60 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61  EMDB ){.      pa
17f70 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
17f80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
17f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
17fb0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
17fc0 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
17fd0 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
17fe0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
17ff0 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
18000 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18010 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
18020 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
18030 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
18040 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
18050 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
18060 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
18070 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
18080 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
18090 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
180a0 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
180b0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
180c0 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
180d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
180e0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
180f0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
18100 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
18110 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
18120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18130 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18140 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
18150 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
18160 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
18170 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
18180 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
18190 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
181a0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  nt(pPager);.  pP
181b0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
181c0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
181d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
181e0 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
181f0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
18200 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
18210 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18220 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
18230 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
18240 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
18250 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
18260 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
18270 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
18280 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182a0 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46     pPager->tempF
182b0 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile);.  pPager->
182c0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
182d0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
182e0 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
182f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
18300 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
18310 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
18320 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
18330 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
18340 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c   sqlite3OsSetFul
18350 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  lSync(pPager->jf
18360 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
18370 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  fsync);.  sqlite
18380 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70  3OsSetFullSync(p
18390 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
183a0 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a  r->full_fsync);.
183b0 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44    sqlite3OsOpenD
183c0 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d  irectory(pPager-
183d0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44  >jfd, pPager->zD
183e0 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61  irectory);.  pPa
183f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18400 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
18410 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
18420 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
18430 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
18440 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
18450 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  back = 0;.  pPag
18460 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
18470 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
18480 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
18490 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
184a0 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
184b0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
184c0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
184d0 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
184e0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
184f0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
18500 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  lHdr(pPager);.. 
18510 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
18520 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d  tAutoopen && rc=
18530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
18550 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70  ger_stmt_begin(p
18560 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
18570 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18580 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
18590 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  MEM ){.    rc = 
185a0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
185b0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
185c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
185d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
185e0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
185f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
18600 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
18610 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
18620 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
18630 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
18640 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
18650 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  al = 0;.  if( rc
18660 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
18670 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
18680 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20   was a malloc() 
18690 66 61 69 6c 75 72 65 2c 20 74 68 65 6e 20 77 65  failure, then we
186a0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f   will not be clo
186b0 73 69 6e 67 20 74 68 65 20 70 61 67 65 72 0a 20  sing the pager. 
186c0 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64     ** file. So d
186d0 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61  elete any journa
186e0 6c 20 66 69 6c 65 20 77 65 20 6d 61 79 20 68 61  l file we may ha
186f0 76 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 2e  ve just created.
18700 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
18710 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 20 77 69  ** the system wi
18720 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73 65 64 2c  ll get confused,
18730 20 77 65 20 68 61 76 65 20 61 20 72 65 61 64 2d   we have a read-
18740 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
18750 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79   and a.    ** my
18760 73 74 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  sterious journal
18770 20 68 61 73 20 61 70 70 65 61 72 65 64 20 69 6e   has appeared in
18780 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e   the filesystem.
18790 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
187a0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
187b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
187c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 67 65   }else{.    page
187d0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
187e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
187f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
18800 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
18810 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
18820 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
18830 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
18840 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
18850 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
18860 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
18870 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20  3pager_commit() 
18880 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
18890 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
188a0 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  rollback() is ca
188b0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
188c0 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
188d0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
188e0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
188f0 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61  er_unref() is ca
18900 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79  lled to on every
18910 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
18920 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
18930 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  st parameter to 
18940 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18950 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79  a pointer to any
18960 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68   open page of th
18970 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
18980 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61  le.  Nothing cha
18990 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70  nges about the p
189a0 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64  age - it is used
189b0 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63   merely to.** ac
189c0 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20  quire a pointer 
189d0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
189e0 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72  ucture and as pr
189f0 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69  oof that there i
18a00 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72  s.** already a r
18a10 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
18a20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
18a30 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  The second param
18a40 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68  eter indicates h
18a50 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e  ow much space in
18a60 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76   bytes to reserv
18a70 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65  e for a.** maste
18a80 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e  r journal file-n
18a90 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ame at the start
18aa0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
18ab0 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74  when it is creat
18ac0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72  ed..**.** A jour
18ad0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
18ae0 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ed if this is no
18af0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  t a temporary fi
18b00 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61  le.  For tempora
18b10 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65  ry.** files, the
18b20 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20   opening of the 
18b30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
18b40 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
18b50 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63  here is an.** ac
18b60 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69  tual need to wri
18b70 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
18b80 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
18b90 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
18ba0 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72  ady reserved for
18bb0 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72   writing, this r
18bc0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
18bd0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c  p..**.** If exFl
18be0 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61  ag is true, go a
18bf0 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20  head and get an 
18c00 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
18c10 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d  n the file.** im
18c20 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61  mediately instea
18c30 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74  d of waiting unt
18c40 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75  il we try to flu
18c50 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
18c60 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20  he.** exFlag is 
18c70 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61  ignored if a tra
18c80 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
18c90 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69  ady active..*/.i
18ca0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
18cb0 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
18cc0 61 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a  a, int exFlag){.
18cd0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
18ce0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
18cf0 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
18d00 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
18d10 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
18d20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
18d30 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
18d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18d50 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
18d60 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
18d70 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
18d80 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
18d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
18da0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
18db0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
18dc0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
18dd0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
18de0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
18df0 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
18e00 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
18e10 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
18e20 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
18e30 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
18e40 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
18e50 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
18e60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18e70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
18e80 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
18e90 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
18ea0 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
18eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
18ec0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
18ed0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
18ee0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
18ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18f00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18f10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18f20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18f30 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
18f40 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
18f50 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  0;.      TRACE2(
18f60 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
18f70 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
18f80 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  er));.      if( 
18f90 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
18fa0 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  al && !pPager->t
18fb0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
18fc0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
18fd0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
18fe0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
18ff0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
19000 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
19010 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20   a page dirty.  
19020 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c  Set its dirty fl
19030 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f  ag and add it to
19040 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61   the dirty.** pa
19050 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
19060 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74  ic void makeDirt
19070 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  y(PgHdr *pPg){. 
19080 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d   if( pPg->dirty=
19090 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
190a0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
190b0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
190c0 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
190d0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
190e0 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ger->pDirty;.   
190f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69   if( pPager->pDi
19100 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61  rty ){.      pPa
19110 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  ger->pDirty->pPr
19120 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  evDirty = pPg;. 
19130 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
19140 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  revDirty = 0;.  
19150 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
19160 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = pPg;.  }.}../
19170 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
19180 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69   clean.  Clear i
19190 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64  ts dirty bit and
191a0 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
191b0 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
191c0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
191d0 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
191e0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
191f0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
19200 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  {.    pPg->dirty
19210 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
19220 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  g->pDirty ){.   
19230 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e     pPg->pDirty->
19240 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
19250 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20  ->pPrevDirty;.  
19260 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
19270 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20  >pPrevDirty ){. 
19280 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44       pPg->pPrevD
19290 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70  irty->pDirty = p
192a0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
192b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
192c0 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ->pPager->pDirty
192d0 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
192e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
192f0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
19300 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
19310 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
19320 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
19330 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
19340 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
19350 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
19360 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
19370 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
19380 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
19390 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
193a0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
193b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
193c0 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
193d0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
193e0 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
193f0 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
19400 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
19410 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
19420 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
19430 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
19440 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
19450 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
19460 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
19470 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
19480 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
19490 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
194a0 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
194b0 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
194c0 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
194d0 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
194e0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
194f0 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
19500 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19510 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
19520 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
19530 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
19540 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
19550 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
19560 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
19570 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
19580 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
19590 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
195a0 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
195b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
195c0 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
195d0 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
195e0 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
195f0 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61  t() or sqlite3pa
19600 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74  ger_rollback() t
19610 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73  o.** reset..*/.s
19620 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
19630 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74  write(void *pDat
19640 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
19650 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
19660 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
19670 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
19680 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
19690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
196a0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
196b0 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
196c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
196d0 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
196e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
196f0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
19700 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
19710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19720 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  PERM;.  }..  ass
19730 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
19740 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
19750 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
19760 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
19770 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
19780 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
19790 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
197a0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
197b0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
197c0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
197d0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b  away..  */.  mak
197e0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
197f0 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
19800 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d  l && (pPg->inStm
19810 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  t || pPager->stm
19820 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
19830 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
19840 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ache = 1;.  }els
19850 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
19860 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
19870 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
19880 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
19890 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
198a0 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
198b0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
198c0 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
198d0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
198e0 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
198f0 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
19900 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
19910 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
19920 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
19930 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
19940 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
19950 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
19960 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19970 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
19980 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
19990 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  e3pager_begin(pD
199a0 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ata, 0);.    if(
199b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
199c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
199d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
199e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
199f0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
19a00 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
19a10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
19a20 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
19a30 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
19a40 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
19a50 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
19a60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
19a80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
19a90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19aa0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
19ab0 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
19ac0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
19ad0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
19ae0 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
19af0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
19b00 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
19b10 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
19b20 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
19b30 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
19b40 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
19b50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
19b60 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
19b70 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
19b80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
19b90 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
19ba0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
19bb0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
19bc0 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
19bd0 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
19be0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45  useJournal || ME
19bf0 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66  MDB) ){.      if
19c00 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
19c10 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
19c20 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
19c30 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20    int szPg;.    
19c40 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
19c50 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73  .          PgHis
19c60 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
19c70 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
19c80 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
19c90 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52      TRACE3("JOUR
19ca0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
19cb0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
19cc0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
19cd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19ce0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
19cf0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
19d00 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
19d10 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
19d20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19d30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
19d40 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
19d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
19d60 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
19d70 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
19d80 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
19d90 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
19da0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
19db0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
19dc0 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a  2 cksum, saved;.
19dd0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
19de0 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20  pData2, *pEnd;. 
19df0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
19e00 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
19e10 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
19e20 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
19e30 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
19e40 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
19e50 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
19e60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
19e70 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
19e80 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
19e90 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
19ea0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19eb0 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
19ec0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
19ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
19ee0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
19ef0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
19f00 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
19f10 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
19f20 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
19f30 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
19f40 20 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20           pEnd = 
19f50 70 44 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d  pData2 + pPager-
19f60 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
19f70 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34       pData2 -= 4
19f80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ;.          save
19f90 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b  d = *(u32*)pEnd;
19fa0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32  .          put32
19fb0 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d  bits(pEnd, cksum
19fc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  );.          szP
19fd0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g = pPager->page
19fe0 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20  Size+8;.        
19ff0 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
1a000 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
1a010 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a020 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1a030 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
1a040 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20  2, szPg);.      
1a050 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
1a060 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
1a070 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1a080 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
1a090 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1a0a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73  r->journalOff, s
1a0b0 7a 50 67 29 29 0a 20 20 20 20 20 20 20 20 20 20  zPg)).          
1a0c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a0d0 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
1a0e0 20 20 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f        TRACE4("JO
1a0f0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1a100 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
1a110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a120 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1a130 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1a140 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
1a150 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29           *(u32*)
1a160 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09  pEnd = saved;...
1a170 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
1a180 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e  s occured writin
1a190 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
1a1a0 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
1a1b0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1a1c0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
1a1d0 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
1a1e0 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
1a1f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1a200 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a210 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a220 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a230 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1a240 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1a250 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Rec++;.         
1a260 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a270 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
1a280 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1a290 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1a2a0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1a2b0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1a2c0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1a2d0 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
1a2e0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1a2f0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1a300 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1a310 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1a320 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1a330 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1a340 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1a350 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64           page_ad
1a360 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1a370 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Pg);.          }
1a380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a3a0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1a3b0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1a3c0 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
1a3d0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1a3e0 20 20 20 20 54 52 41 43 45 34 28 22 41 50 50 45      TRACE4("APPE
1a3f0 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
1a400 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
1a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1a420 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1a430 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
1a440 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
1a450 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
1a460 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1a470 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
1a480 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1a490 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e   }.      pPg->in
1a4a0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1a4b0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
1a4c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1a4d0 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
1a4e0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
1a4f0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
1a500 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
1a510 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
1a520 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1a530 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
1a540 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
1a550 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
1a560 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
1a570 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
1a580 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
1a590 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
1a5a0 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
1a5b0 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
1a5c0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
1a5d0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1a5e0 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
1a5f0 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
1a600 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1a610 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
1a620 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1a630 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
1a640 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
1a650 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
1a660 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
1a670 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
1a680 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1a690 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1a6a0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1a6b0 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
1a6c0 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->pStmt==0 );.  
1a6d0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1a6e0 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
1a6f0 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
1a700 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1a710 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
1a720 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
1a730 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
1a740 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
1a750 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
1a760 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1a770 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52      }.        TR
1a780 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
1a790 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1a7a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1a7b0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
1a7c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a7d0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1a7e0 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1a7f0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1a800 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20  no, 7)-4;.      
1a810 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
1a820 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
1a830 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a840 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1a850 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32  er->stfd, pData2
1a860 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1a870 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 54  ze+4);.        T
1a880 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
1a890 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1a8a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1a8b0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1a8c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1a8d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a8e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1a8f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a900 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1a910 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  NRec++;.        
1a920 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a930 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
1a940 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1a950 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1a960 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1a970 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a  gno&7);.      }.
1a980 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
1a990 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1a9a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a9b0 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
1a9c0 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
1a9d0 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
1a9e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1a9f0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1aa00 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
1aa10 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
1aa20 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
1aa30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1aa40 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
1aa50 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  if( !MEMDB && pP
1aa60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45  ager->dbSize==PE
1aa70 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
1aa80 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
1aa90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1aaa0 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
1aab0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1aac0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1aad0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1aae0 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65  mark a data-page
1aaf0 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74   as writable. It
1ab00 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f   uses .** pager_
1ab10 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20  write() to open 
1ab20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  a journal file (
1ab30 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1ab40 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e  eady open).** an
1ab50 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65  d write the page
1ab60 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a   *pData to the j
1ab70 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
1ab80 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1ab90 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
1aba0 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
1abb0 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
1abc0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
1abd0 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
1abe0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
1abf0 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
1ac00 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
1ac10 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
1ac20 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
1ac30 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
1ac40 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
1ac50 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1ac60 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
1ac70 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
1ac80 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
1ac90 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1aca0 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  e(void *pData){.
1acb0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1acc0 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
1acd0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
1ace0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
1acf0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1ad00 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
1ad10 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
1ad20 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
1ad30 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
1ad40 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  ageSize);..  if(
1ad50 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65   !MEMDB && nPage
1ad60 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
1ad70 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
1ad80 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
1ad90 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1ada0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1adb0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
1adc0 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
1add0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1ade0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
1adf0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
1ae00 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
1ae10 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
1ae20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ae30 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
1ae40 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
1ae50 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
1ae60 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74   ii;..    /* Set
1ae70 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
1ae80 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
1ae90 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
1aea0 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
1aeb0 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
1aec0 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
1aed0 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
1aee0 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
1aef0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
1af00 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1af10 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1af20 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
1af30 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1af40 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
1af50 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
1af60 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
1af70 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
1af80 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
1af90 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
1afa0 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
1afb0 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
1afc0 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
1afd0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1afe0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1aff0 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
1b000 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
1b010 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
1b020 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
1b030 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
1b040 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
1b050 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 70  Count = sqlite3p
1b060 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
1b070 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1b080 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
1b090 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
1b0a0 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
1b0b0 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d   - pg1)+1;.    }
1b0c0 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50  else if( (pg1+nP
1b0d0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e  agePerSector-1)>
1b0e0 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1b0f0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
1b100 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
1b110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1b120 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
1b130 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
1b140 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
1b150 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31  ;.    assert(pg1
1b160 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
1b170 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
1b180 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
1b190 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
1b1a0 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d  ii<nPage && rc==
1b1b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
1b1c0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20  {.      Pgno pg 
1b1d0 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20  = pg1+ii;.      
1b1e0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e  if( !pPager->aIn
1b1f0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70  Journal || pg==p
1b200 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20  Pg->pgno || .   
1b210 20 20 20 20 20 20 20 70 67 3e 70 50 61 67 65 72         pg>pPager
1b220 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20  ->origDbSize || 
1b230 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  !(pPager->aInJou
1b240 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28  rnal[pg/8]&(1<<(
1b250 70 67 26 37 29 29 29 0a 20 20 20 20 20 20 29 20  pg&7))).      ) 
1b260 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
1b270 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
1b280 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1b290 20 20 20 20 20 76 6f 69 64 20 2a 70 50 61 67 65       void *pPage
1b2a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1b2b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1b2c0 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
1b2d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1b2e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b2f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1b300 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1b310 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
1b320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
1b330 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
1b340 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b360 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1b370 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
1b380 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Sync==1 );.    p
1b390 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1b3a0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1b3b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1b3c0 69 74 65 28 70 44 61 74 61 29 3b 0a 20 20 7d 0a  ite(pData);.  }.
1b3d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b3e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1b3f0 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
1b400 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1b410 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
1b420 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
1b430 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1b440 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
1b450 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
1b460 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
1b470 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
1b480 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
1b490 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
1b4a0 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
1b4b0 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
1b4c0 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
1b4d0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
1b4e0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1b4f0 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
1b500 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65  pPg->dirty;.}.#e
1b510 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1b520 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
1b530 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
1b540 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
1b550 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
1b560 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1b570 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
1b580 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
1b590 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  t sqlite3pager_o
1b5a0 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
1b5b0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1b5c0 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
1b5d0 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a  .  void *pPage;.
1b5e0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
1b5f0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1b600 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
1b610 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
1b620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b630 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b640 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1b650 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
1b660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b670 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
1b680 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
1b690 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1b6a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
1b6b0 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
1b6c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b6d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1b6e0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1b6f0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1b700 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
1b710 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1b720 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
1b730 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
1b740 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63   page "pgno" bac
1b750 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
1b760 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
1b770 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
1b780 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
1b790 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
1b7a0 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
1b7b0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
1b7c0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
1b7d0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
1b7e0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1b7f0 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
1b800 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
1b810 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
1b820 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
1b830 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
1b840 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
1b850 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
1b860 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
1b870 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
1b880 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
1b890 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
1b8a0 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
1b8b0 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
1b8c0 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
1b8d0 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
1b8e0 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
1b8f0 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
1b900 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
1b910 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1b920 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1b930 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
1b940 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
1b950 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
1b960 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
1b970 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
1b980 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
1b990 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
1b9a0 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
1b9b0 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
1b9c0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1b9d0 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
1b9e0 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
1b9f0 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
1ba00 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1ba10 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
1ba20 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
1ba30 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
1ba40 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1ba50 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
1ba60 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
1ba70 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
1ba80 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
1ba90 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
1baa0 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
1bab0 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
1bac0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1bad0 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
1bae0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1baf0 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
1bb00 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
1bb10 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
1bb20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
1bb30 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f  ause the page co
1bb40 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63  ntains.** critic
1bb50 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
1bb60 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
1bb70 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64  e it gets rolled
1bb80 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a   back in spite.*
1bb90 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f  * of the dont_ro
1bba0 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
1bbb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1bbc0 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50  ger_dont_write(P
1bbd0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1bbe0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
1bbf0 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d  r *pPg;..  if( M
1bc00 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a  EMDB ) return;..
1bc10 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
1bc20 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1bc30 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
1bc40 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 6e  g!=0 );  /* We n
1bc50 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f  ever call _dont_
1bc60 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68 65  write unless the
1bc70 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d 20   page is in mem 
1bc80 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  */.  pPg->always
1bc90 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
1bca0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26  if( pPg->dirty &
1bcb0 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  & !pPager->stmtI
1bcc0 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65  nUse ){.    asse
1bcd0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1bce0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1bcf0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1bd00 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
1bd10 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
1bd20 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
1bd30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
1bd40 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1bd50 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
1bd60 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
1bd70 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
1bd80 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
1bd90 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
1bda0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1bdb0 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
1bdc0 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
1bdd0 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
1bde0 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
1bdf0 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
1be00 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
1be10 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
1be20 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
1be30 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
1be40 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
1be50 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
1be60 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
1be70 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
1be80 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
1be90 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
1bea0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
1beb0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
1bec0 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
1bed0 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
1bee0 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
1bef0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
1bf00 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
1bf10 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
1bf20 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
1bf30 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1bf40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41  }else{.      TRA
1bf50 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE3("DONT_WRITE 
1bf60 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
1bf70 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  , pgno, PAGERID(
1bf80 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1bf90 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
1bfa0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1bfb0 2c 20 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d  , pgno)).      m
1bfc0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23  akeClean(pPg);.#
1bfd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1bfe0 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70  CK_PAGES.      p
1bff0 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
1c000 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1c010 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  g);.#endif.    }
1c020 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
1c030 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1c040 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1c050 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
1c060 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
1c070 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
1c080 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
1c090 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
1c0a0 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
1c0b0 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
1c0c0 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
1c0d0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
1c0e0 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
1c0f0 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
1c100 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
1c110 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1c120 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
1c130 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  k(void *pData){.
1c140 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
1c150 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
1c160 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
1c170 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1c180 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  er;..  assert( p
1c190 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1c1a0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1c1b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1c1c0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72  urnalOpen==0 ) r
1c1d0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
1c1e0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1c1f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61   || pPager->alwa
1c200 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45  ysRollback || ME
1c210 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  MDB ) return;.  
1c220 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
1c230 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
1c240 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
1c250 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1c260 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c270 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
1c280 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1c290 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
1c2a0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1c2b0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1c2c0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1c2d0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
1c2e0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1c2f0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1c300 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
1c310 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1c320 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
1c330 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
1c340 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
1c350 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f  }.    TRACE3("DO
1c360 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
1c370 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
1c380 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
1c390 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49  (pPager));.    I
1c3a0 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45  OTRACE(("GARBAGE
1c3b0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1c3c0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
1c3d0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1c3e0 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70  >stmtInUse && !p
1c3f0 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69  Pg->inStmt && (i
1c400 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
1c410 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
1c420 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1c430 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
1c440 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
1c450 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1c460 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
1c470 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1c480 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
1c490 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1c4a0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1c4b0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1c4c0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
1c4d0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  t_list(pPg);.  }
1c4e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  .}.../*.** Commi
1c4f0 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
1c500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
1c510 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
1c520 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
1c530 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
1c540 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
1c550 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
1c560 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
1c570 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1c580 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1c590 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
1c5a0 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
1c5b0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
1c5c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c5d0 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67  pager_commit(Pag
1c5e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1c5f0 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
1c600 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  pPg;..  if( pPag
1c610 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1c620 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1c630 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
1c640 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1c650 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
1c660 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1c670 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1c680 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d  }.  TRACE2("COMM
1c690 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
1c6a0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
1c6b0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
1c6c0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
1c6d0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
1c6e0 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c  Pager);.    whil
1c6f0 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  e( pPg ){.      
1c700 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
1c710 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1c720 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1c730 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
1c740 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1c750 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
1c760 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pPg->inStmt = 0;
1c770 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
1c780 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sync = 0;.      
1c790 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
1c7a0 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
1c7b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
1c7c0 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
1c7d0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
1c7e0 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e  pDirty = 0;.#ifn
1c7f0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66  def NDEBUG.    f
1c800 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1c810 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
1c820 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
1c830 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1c840 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1c850 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1c860 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c870 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
1c880 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
1c890 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
1c8a0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
1c8b0 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
1c8c0 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
1c8d0 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  dif.    pPager->
1c8e0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
1c8f0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1c900 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
1c910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c920 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  K;.  }.  if( pPa
1c930 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d  ger->dirtyCache=
1c940 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69  =0 ){.    /* Exi
1c950 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74  t early (without
1c960 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d   doing the time-
1c970 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65  consuming sqlite
1c980 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29  3OsSync() calls)
1c990 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65  .    ** if there
1c9a0 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68   have been no ch
1c9b0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1c9c0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
1c9d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c9e0 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  r->needSync==0 )
1c9f0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1ca00 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
1ca10 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
1ca20 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1ca30 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1ca40 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
1ca50 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1ca60 6e 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  nc(pPager, 0, 0)
1ca70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ca80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1ca90 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1caa0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
1cab0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cac0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1cad0 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68  all changes.  Th
1cae0 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
1caf0 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
1cb00 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41  HARED mode..** A
1cb10 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ll in-memory cac
1cb20 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20  he pages revert 
1cb30 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  to their origina
1cb40 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e  l data contents.
1cb50 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1cb60 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
1cb70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1cb80 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73  annot fail unles
1cb90 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
1cba0 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
1cbb0 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72  owing.** the cor
1cbc0 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  rect locking pro
1cbd0 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52  tocol (SQLITE_PR
1cbe0 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73  OTOCOL) or unles
1cbf0 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
1cc00 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
1cc10 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
1cc20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1cc30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
1cc40 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
1cc50 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
1cc60 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
1cc70 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
1cc80 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
1cc90 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
1cca0 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
1ccb0 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
1ccc0 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
1ccd0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1cce0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1ccf0 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
1cd00 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1cd10 72 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52 4f  rc;.  TRACE2("RO
1cd20 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
1cd30 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1cd40 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1cd50 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
1cd60 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
1cd70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
1cd80 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
1cd90 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
1cda0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1cdb0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1cdc0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
1cdd0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
1cde0 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
1cdf0 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
1ce00 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
1ce10 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  r))->pOrig );.  
1ce20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
1ce30 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
1ce40 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1ce50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b  ager))->pStmt );
1ce60 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
1ce70 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
1ce80 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f    pHist = PGHDR_
1ce90 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
1cea0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  r);.      if( pH
1ceb0 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
1cec0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
1ced0 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
1cee0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61  Hist->pOrig, pPa
1cef0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1cf00 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
1cf10 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64  ROLLBACK-PAGE %d
1cf20 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   of %d\n", p->pg
1cf30 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1cf40 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  er));.      }els
1cf50 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  e{.        TRACE
1cf60 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c  3("PAGE %d is cl
1cf70 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d  ean on %d\n", p-
1cf80 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1cf90 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
1cfa0 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
1cfb0 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
1cfc0 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a    p->dirty = 0;.
1cfd0 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e        p->inJourn
1cfe0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  al = 0;.      p-
1cff0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
1d000 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20     p->pPrevStmt 
1d010 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  = p->pNextStmt =
1d020 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   0;.      if( pP
1d030 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
1d040 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1d050 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48  r->xReiniter(PGH
1d060 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
1d070 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1d080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d090 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1d0a0 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
1d0b0 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
1d0c0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1d0d0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  e = pPager->orig
1d0e0 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f  DbSize;.    memo
1d0f0 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
1d100 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
1d110 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
1d120 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1d130 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
1d140 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d150 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
1d160 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  ( !pPager->dirty
1d170 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72  Cache || !pPager
1d180 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
1d190 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d1a0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
1d1b0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
1d1c0 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rc;.  }..  if( p
1d1d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
1d1e0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1d1f0 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
1d200 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
1d210 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
1d220 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
1d230 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
1d240 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1d250 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1d260 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1d270 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1d280 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
1d290 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  VED ){.    int r
1d2a0 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c2;.    rc = pag
1d2b0 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
1d2c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32  pPager);.    rc2
1d2d0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
1d2e0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1d2f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d300 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1d310 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
1d320 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
1d330 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
1d340 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61  ager);.  }.  pPa
1d350 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1d360 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
1d370 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
1d380 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65  g a ROLLBACK, we
1d390 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74   can no longer t
1d3a0 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20  rust the pager. 
1d3b0 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
1d3c0 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
1d3d0 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
1d3e0 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
1d3f0 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65  r .  ** persiste
1d400 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  nt..  */.  retur
1d410 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1d420 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
1d430 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1d440 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1d450 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
1d460 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
1d470 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
1d480 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
1d490 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
1d4a0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
1d4b0 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e  e3pager_isreadon
1d4c0 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
1d4d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1d4e0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
1d4f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1d500 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
1d510 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
1d520 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
1d530 74 65 33 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  te3pager_refcoun
1d540 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
1d550 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1d560 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64  r->nRef;.}..#ifd
1d570 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
1d580 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d590 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
1d5a0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
1d5b0 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
1d5c0 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74  *sqlite3pager_st
1d5d0 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
1d5e0 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
1d5f0 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
1d600 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
1d610 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
1d620 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
1d630 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
1d640 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
1d650 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
1d660 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
1d670 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
1d680 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
1d690 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
1d6a0 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
1d6b0 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
1d6c0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c   = pPager->nOvfl
1d6d0 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65  ;.  a[9] = pPage
1d6e0 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30  r->nRead;.  a[10
1d6f0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69  ] = pPager->nWri
1d700 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a  te;.  return a;.
1d710 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1d720 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  Set the statemen
1d730 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74  t rollback point
1d740 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1d750 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63  tine should be c
1d760 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  alled with the t
1d770 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1d780 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70  al already.** op
1d790 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65  en.  A new state
1d7a0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
1d7b0 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e  created that can
1d7c0 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c   be used to roll
1d7d0 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20  back.** changes 
1d7e0 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  of a single SQL 
1d7f0 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61  command within a
1d800 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74   larger transact
1d810 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1d820 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  te3pager_stmt_be
1d830 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
1d840 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1d850 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1d860 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20  >stmtInUse );.  
1d870 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d880 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
1d890 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RED );.  assert(
1d8a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
1d8b0 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22  =0 );.  TRACE2("
1d8c0 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
1d8d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1d8e0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1d8f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
1d900 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
1d910 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
1d920 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1d930 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
1d940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1d950 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
1d960 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
1d970 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1d980 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
1d990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d9a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1d9b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1d9c0 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  en );.  pPager->
1d9d0 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  aInStmt = sqlite
1d9e0 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
1d9f0 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
1da00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
1da10 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
1da20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  /* sqlite3OsLock
1da30 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
1da40 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20  RED_LOCK); */.  
1da50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1da60 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64  NOMEM;.  }.#ifnd
1da70 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d  ef NDEBUG.  rc =
1da80 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1da90 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1daa0 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69  &pPager->stmtJSi
1dab0 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
1dac0 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
1dad0 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74  failed;.  assert
1dae0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  ( pPager->stmtJS
1daf0 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a  ize == pPager->j
1db00 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e  ournalOff );.#en
1db10 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  dif.  pPager->st
1db20 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
1db30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
1db40 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1db50 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1db60 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
1db70 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
1db80 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
1db90 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
1dba0 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
1dbb0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
1dbc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dbd0 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
1dbe0 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
1dbf0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
1dc00 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
1dc10 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  led;.    pPager-
1dc20 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >stmtOpen = 1;. 
1dc30 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
1dc40 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
1dc50 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1dc60 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
1dc70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74  QLITE_OK;. .stmt
1dc80 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
1dc90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
1dca0 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
1dcb0 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
1dcc0 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
1dcd0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
1dce0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1dcf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
1dd00 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  it a statement..
1dd10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1dd20 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
1dd30 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1dd40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1dd50 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
1dd60 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
1dd70 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53  t;.    TRACE2("S
1dd80 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
1dd90 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1dda0 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  ));.    if( !MEM
1ddb0 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  DB ){.      sqli
1ddc0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
1ddd0 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->stfd, 0);.    
1dde0 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72    /* sqlite3OsTr
1ddf0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73  uncate(pPager->s
1de00 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  tfd, 0); */.    
1de10 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
1de20 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b  ager->aInStmt );
1de30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
1de40 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  InStmt = 0;.    
1de50 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  }.    for(pPg=pP
1de60 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
1de70 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
1de80 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
1de90 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20  >pNextStmt;.    
1dea0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1deb0 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
1dec0 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
1ded0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
1dee0 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
1def0 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
1df00 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1df10 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1df20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1df30 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1df40 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  er);.        sql
1df50 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
1df60 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Stmt);.        p
1df70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
1df80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1df90 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
1dfa0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
1dfb0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
1dfc0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1dfd0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pStmt = 0;.  }. 
1dfe0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1dff0 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
1e000 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e010 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1e020 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
1e030 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1e040 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_stmt_rollback(
1e050 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e060 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1e070 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1e080 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28  e ){.    TRACE2(
1e090 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25  "STMT-ROLLBACK %
1e0a0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1e0b0 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
1e0c0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
1e0d0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
1e0e0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
1e0f0 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
1e100 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29  =pPg->pNextStmt)
1e110 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
1e120 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1e130 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1e140 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1e150 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
1e160 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
1e170 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
1e180 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
1e190 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
1e1a0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1e1b0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1e1c0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
1e1d0 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
1e1e0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
1e1f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e200 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1e210 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
1e220 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f  Size;.      memo
1e230 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
1e240 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
1e250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1e260 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1e270 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
1e280 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1e290 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61   }.    sqlite3pa
1e2a0 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
1e2b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
1e2c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1e2d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
1e2e0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
1e2f0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1e300 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1e310 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
1e320 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
1e330 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
1e340 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1e350 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28  3pager_filename(
1e360 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e370 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1e380 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
1e390 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1e3a0 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
1e3b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1e3c0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1e3d0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e  qlite3pager_dirn
1e3e0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
1e3f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1e400 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b  ger->zDirectory;
1e410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e420 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
1e430 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
1e440 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
1e450 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61   char *sqlite3pa
1e460 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28  ger_journalname(
1e470 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e480 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1e490 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
1e4a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1e4b0 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
1e4c0 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
1e4d0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
1e4e0 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
1e4f0 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
1e500 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
1e510 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e520 70 61 67 65 72 5f 6e 6f 73 79 6e 63 28 50 61 67  pager_nosync(Pag
1e530 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1e540 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
1e550 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Sync;.}../*.** S
1e560 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
1e570 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
1e580 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
1e590 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61  _set_codec(.  Pa
1e5a0 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
1e5b0 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
1e5c0 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
1e5d0 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
1e5e0 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
1e5f0 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
1e600 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
1e610 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
1e620 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ecArg;.}../*.** 
1e630 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e640 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
1e650 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
1e660 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
1e670 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
1e680 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
1e690 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
1e6a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e6b0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1e6c0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
1e6d0 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61  er){.  void *pPa
1e6e0 67 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  ge;.  PgHdr *pPg
1e6f0 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67  Hdr;.  u32 chang
1e700 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74  e_counter;.  int
1e710 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20   rc;..  /* Open 
1e720 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
1e730 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
1e740 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1e750 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
1e760 72 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, 1, &pPage);. 
1e770 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e780 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1e790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1e7a0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
1e7b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1e7c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1e7d0 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  c;..  /* Read th
1e7e0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
1e7f0 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  at byte 24. */. 
1e800 20 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54   pPgHdr = DATA_T
1e810 4f 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a  O_PGHDR(pPage);.
1e820 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1e830 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74   = retrieve32bit
1e840 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a  s(pPgHdr, 24);..
1e850 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1e860 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1e870 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1e880 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1e890 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1e8a0 6e 74 65 72 2b 2b 3b 0a 20 20 70 75 74 33 32 62  nter++;.  put32b
1e8b0 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44  its(((char*)PGHD
1e8c0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72  R_TO_DATA(pPgHdr
1e8d0 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  ))+24, change_co
1e8e0 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 52 65  unter);..  /* Re
1e8f0 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
1e900 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73  eference. */.  s
1e910 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
1e920 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  f(pPage);.  retu
1e930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e940 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1e950 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1e960 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
1e970 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
1e980 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
1e990 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
1e9a0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1e9b0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
1e9c0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
1e9d0 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
1e9e0 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
1e9f0 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
1ea00 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
1ea10 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
1ea20 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
1ea30 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1ea40 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1ea50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
1ea60 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
1ea70 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
1ea80 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1ea90 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
1eaa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1eab0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1eac0 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
1ead0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
1eae0 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
1eaf0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
1eb00 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
1eb10 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1eb20 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
1eb30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1eb40 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
1eb50 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1eb60 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
1eb70 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
1eb80 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
1eb90 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
1eba0 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
1ebb0 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63  e3pager_sync() c
1ebc0 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  all..**.** If pa
1ebd0 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69  rameter nTrunc i
1ebe0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1ebf0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
1ec00 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  is truncated to.
1ec10 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20  ** nTrunc pages 
1ec20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79  (this is used by
1ec30 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1ec40 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20  abases)..*/.int 
1ec50 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
1ec60 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  c(Pager *pPager,
1ec70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1ec80 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e  ster, Pgno nTrun
1ec90 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
1eca0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52 41  QLITE_OK;..  TRA
1ecb0 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59  CE4("DATABASE SY
1ecc0 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
1ecd0 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64  ter=%s nTrunc=%d
1ece0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
1ecf0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1ed00 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b  Master, nTrunc);
1ed10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1ed20 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
1ed30 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
1ed40 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
1ed50 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
1ed60 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
1ed70 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
1ed80 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
1ed90 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
1eda0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1edb0 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45  ER_SYNCED && !ME
1edc0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
1edd0 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
1ede0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
1edf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ee00 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1ee10 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73  .    /* If a mas
1ee20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1ee30 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
1ee40 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1ee50 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  o the.    ** jou
1ee60 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
1ee70 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  no sync is requi
1ee80 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e  red. This happen
1ee90 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20  s when it is.   
1eea0 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65   ** written, the
1eeb0 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61  n the process fa
1eec0 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66  ils to upgrade f
1eed0 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74  rom a RESERVED t
1eee0 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  o an.    ** EXCL
1eef0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20  USIVE lock. The 
1ef00 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72  next time the pr
1ef10 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63  ocess tries to c
1ef20 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  ommit the.    **
1ef30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
1ef40 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68   m-j name will h
1ef50 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1ef60 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
1ef70 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1ef80 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20  ->setMaster ){. 
1ef90 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1efa0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1efb0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
1efc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1efd0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1efe0 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51  exit;.#ifndef SQ
1eff0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f000 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e  CUUM.      if( n
1f010 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1f020 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
1f030 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
1f040 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
1f050 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
1f060 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20  ll pages.       
1f070 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
1f080 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
1f090 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
1f0a0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
1f0b0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1f0c0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
1f0d0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  .        Pgno i;
1f0e0 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70  .        void *p
1f0f0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Page;.        in
1f100 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  t iSkip = PAGER_
1f110 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
1f120 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d  .        for( i=
1f130 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61  nTrunc+1; i<=pPa
1f140 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1f150 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
1f160 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e    if( !(pPager->
1f170 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20  aInJournal[i/8] 
1f180 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26  & (1<<(i&7))) &&
1f190 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
1f1a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1f1b0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1f1c0 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65  Pager, i, &pPage
1f1d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1f1e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f1f0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1f200 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
1f210 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1f220 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
1f230 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1f240 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
1f250 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1f260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f270 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1f280 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1f290 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  }.        } .   
1f2a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1f2b0 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
1f2c0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1f2d0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1f2e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f2f0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1f300 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  exit;.      rc =
1f310 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1f320 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1f330 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f340 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1f350 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
1f360 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1f370 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54  ACUUM.    if( nT
1f380 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
1f390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1f3a0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1f3b0 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20  er, nTrunc);.   
1f3c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f3d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1f3e0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  _exit;.    }.#en
1f3f0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
1f400 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
1f410 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1f420 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50  e file */.    pP
1f430 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
1f440 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
1f450 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  ager);.    rc = 
1f460 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1f470 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
1f480 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f490 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1f4a0 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  t;..    /* Sync 
1f4b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f4c0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
1f4d0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1f4e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f4f0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1f500 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ->fd, 0);.    }.
1f510 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
1f520 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1f530 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
1f540 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1f550 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SYNCED;.  }else 
1f560 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72  if( MEMDB && nTr
1f570 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  unc!=0 ){.    rc
1f580 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1f590 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1f5a0 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73   nTrunc);.  }..s
1f5b0 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75  ync_exit:.  retu
1f5c0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1f5d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1f5e0 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d  TOVACUUM./*.** M
1f5f0 6f 76 65 20 74 68 65 20 70 61 67 65 20 69 64 65  ove the page ide
1f600 6e 74 69 66 69 65 64 20 62 79 20 70 44 61 74 61  ntified by pData
1f610 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e   to location pgn
1f620 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a  o in the file. .
1f630 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
1f640 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
1f650 73 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  s to the current
1f660 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63   page pgno. If c
1f670 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70  urrent page.** p
1f680 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
1f690 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  dy in the rollba
1f6a0 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
1f6b0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68  s not written th
1f6c0 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69  ere by.** by thi
1f6d0 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73  s routine. The s
1f6e0 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74  ame applies to t
1f6f0 68 65 20 70 61 67 65 20 70 44 61 74 61 20 72 65  he page pData re
1f700 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79  fers to on entry
1f710 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   to.** this rout
1f720 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ine..**.** Refer
1f730 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
1f740 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20  e refered to by 
1f750 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c  pData remain val
1f760 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79  id. Updating any
1f770 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73  .** meta-data as
1f780 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1f790 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64  ge pData (i.e. d
1f7a0 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
1f7b0 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  e nExtra bytes.*
1f7c0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
1f7d0 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29  g with the page)
1f7e0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
1f7f0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
1f800 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  ller..**.** A tr
1f810 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1f820 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68  e active when th
1f830 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1f840 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f  lled. It used to
1f850 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   be.** required 
1f860 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
1f870 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
1f880 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74   not active, but
1f890 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
1f8a0 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65  n.** has been re
1f8b0 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e  moved (CREATE IN
1f8c0 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76  DEX needs to mov
1f8d0 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20  e a page when a 
1f8e0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
1f8f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1f900 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ve)..*/.int sqli
1f910 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67  te3pager_movepag
1f920 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1f930 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 50 67   void *pData, Pg
1f940 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
1f950 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
1f960 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
1f970 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
1f980 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f  .  int h;.  Pgno
1f990 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
1f9a0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
1f9b0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
1f9c0 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20  TRACE5("MOVE %d 
1f9d0 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
1f9e0 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
1f9f0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
1fa00 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1fa10 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
1fa20 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20  edSync, pgno);. 
1fa30 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20   IOTRACE(("MOVE 
1fa40 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61  %p %d %d\n", pPa
1fa50 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
1fa60 70 67 6e 6f 29 29 0a 0a 20 20 69 66 28 20 70 50  pgno))..  if( pP
1fa70 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
1fa80 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
1fa90 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
1faa0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1fab0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
1fac0 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
1fad0 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
1fae0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1faf0 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  c );.  }..  /* U
1fb00 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
1fb10 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a  t's hash-chain *
1fb20 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
1fb30 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
1fb40 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1fb50 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
1fb60 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
1fb70 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
1fb80 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
1fb90 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e  it's hash chain.
1fba0 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
1fbb0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
1fbc0 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
1fbd0 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
1fbe0 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
1fbf0 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
1fc00 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
1fc10 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
1fc20 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
1fc30 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  */.  pPgOld = pa
1fc40 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1fc50 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
1fc60 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73  pPgOld ){.    as
1fc70 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52  sert( pPgOld->nR
1fc80 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c  ef==0 );.    unl
1fc90 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
1fca0 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20  ger, pPgOld);.  
1fcb0 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f    makeClean(pPgO
1fcc0 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  ld);.    if( pPg
1fcd0 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  Old->needSync ){
1fce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fcf0 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  PgOld->inJournal
1fd00 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
1fd10 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
1fd20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
1fd30 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  c = 1;.      ass
1fd40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1fd50 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20  dSync );.    }. 
1fd60 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20   }..  /* Change 
1fd70 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1fd80 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65  for pPg and inse
1fd90 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e  rt it into the n
1fda0 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a  ew hash-chain. *
1fdb0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  /.  assert( pgno
1fdc0 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67  !=0 );.  pPg->pg
1fdd0 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d  no = pgno;.  h =
1fde0 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
1fdf0 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28  >nHash-1);.  if(
1fe00 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1fe10 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ] ){.    assert(
1fe20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1fe30 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  ]->pPrevHash==0 
1fe40 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1fe50 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
1fe60 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20  sh = pPg;.  }.  
1fe70 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
1fe80 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1fe90 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  ];.  pPager->aHa
1fea0 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70  sh[h] = pPg;.  p
1feb0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
1fec0 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28  0;..  makeDirty(
1fed0 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
1fee0 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
1fef0 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
1ff00 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
1ff10 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
1ff20 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
1ff30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ff40 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
1ff50 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
1ff60 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
1ff70 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
1ff80 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
1ff90 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
1ffa0 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
1ffb0 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
1ffc0 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
1ffd0 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
1ffe0 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f    ** Pager.aInJo
1fff0 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65  urnal bit has be
20000 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
20010 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
20020 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20  d by loading.   
20030 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74   ** the page int
20040 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
20050 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
20060 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
20070 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
20080 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
20090 70 61 67 65 72 5f 67 65 74 28 29 20 63 61 6c 6c  pager_get() call
200a0 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a   may cause the j
200b0 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20  ournal to sync. 
200c0 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  So make.    ** s
200d0 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65  ure the Pager.ne
200e0 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
200f0 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  et too..    */. 
20100 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 76     int rc;.    v
20110 6f 69 64 20 2a 70 4e 65 65 64 53 79 6e 63 3b 0a  oid *pNeedSync;.
20120 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20130 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
20140 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20150 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
20160 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
20170 26 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  &pNeedSync);.   
20180 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20190 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
201a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
201b0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44 41  Sync = 1;.    DA
201c0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
201d0 64 53 79 6e 63 29 2d 3e 6e 65 65 64 53 79 6e 63  dSync)->needSync
201e0 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54   = 1;.    DATA_T
201f0 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e  O_PGHDR(pNeedSyn
20200 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  c)->inJournal = 
20210 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79  1;.    makeDirty
20220 28 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70  (DATA_TO_PGHDR(p
20230 4e 65 65 64 53 79 6e 63 29 29 3b 0a 20 20 20 20  NeedSync));.    
20240 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
20250 65 66 28 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20  ef(pNeedSync);. 
20260 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
20270 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
20280 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
20290 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
202a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
202b0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
202c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
202d0 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c  te of the file l
202e0 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65  ock for the give
202f0 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  n pager..** The 
20300 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
20310 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20  one of NO_LOCK, 
20320 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
20330 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50  ERVED_LOCK,.** P
20340 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20  ENDING_LOCK, or 
20350 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
20360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
20370 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61  ger_lockstate(Pa
20380 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20390 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
203a0 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65 72  LockState(pPager
203b0 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ->fd);.}.#endif.
203c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
203d0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
203e0 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
203f0 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
20400 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
20410 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
20420 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
20430 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67  dump(Pager *pPag
20440 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
20450 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  g;.  for(pPg=pPa
20460 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
20470 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
20480 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  l){.    if( pPg-
20490 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69  >nRef<=0 ) conti
204a0 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nue;.    sqlite3
204b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47  DebugPrintf("PAG
204c0 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52  E %3d addr=%p nR
204d0 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ef=%d\n", .     
204e0 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48    pPg->pgno, PGH
204f0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
20500 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d   pPg->nRef);.  }
20510 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69  .}.#endif..#endi
20520 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
20530 5f 44 49 53 4b 49 4f 20 2a 2f 0a                 _DISKIO */.