/ Hex Artifact Content
Login

Artifact feb44bd0279f77319079c1fddf9be927b052d028:


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 31 32  : pager.c,v 1.12
0350: 35 20 32 30 30 34 2f 30 36 2f 31 34 20 30 35 3a  5 2004/06/14 05:
0360: 31 30 3a 34 33 20 64 61 6e 69 65 6c 6b 31 39 37  10:43 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0380: 75 64 65 20 22 6f 73 2e 68 22 20 20 20 20 20 20  ude "os.h"      
0390: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 66 69     /* Must be fi
03a0: 72 73 74 20 74 6f 20 65 6e 61 62 6c 65 20 6c 61  rst to enable la
03b0: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
03c0: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71   */.#include "sq
03d0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
03e0: 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69  ude "pager.h".#i
03f0: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0410: 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  ng.h>../*.** Mac
0420: 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73  ros for troubles
0430: 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c  hooting.  Normal
0440: 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f  ly turned off.*/
0450: 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 50 61  .#if 0.static Pa
0460: 67 65 72 20 2a 6d 61 69 6e 50 61 67 65 72 20 3d  ger *mainPager =
0470: 20 30 3b 0a 23 64 65 66 69 6e 65 20 53 45 54 5f   0;.#define SET_
0480: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
0490: 69 6e 50 61 67 65 72 3d 3d 30 20 29 20 6d 61 69  inPager==0 ) mai
04a0: 6e 50 61 67 65 72 20 3d 20 28 58 29 0a 23 64 65  nPager = (X).#de
04b0: 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28 58  fine CLR_PAGER(X
04c0: 29 20 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72  )  if( mainPager
04d0: 3d 3d 28 58 29 20 29 20 6d 61 69 6e 50 61 67 65  ==(X) ) mainPage
04e0: 72 20 3d 20 30 0a 23 64 65 66 69 6e 65 20 54 52  r = 0.#define TR
04f0: 41 43 45 31 28 58 29 20 20 20 20 20 69 66 28 20  ACE1(X)     if( 
0500: 70 50 61 67 65 72 3d 3d 6d 61 69 6e 50 61 67 65  pPager==mainPage
0510: 72 20 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  r ) sqlite3Debug
0520: 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69 6e  Printf(X).#defin
0530: 65 20 54 52 41 43 45 32 28 58 2c 59 29 20 20 20  e TRACE2(X,Y)   
0540: 69 66 28 20 70 50 61 67 65 72 3d 3d 6d 61 69 6e  if( pPager==main
0550: 50 61 67 65 72 20 29 20 73 71 6c 69 74 65 33 44  Pager ) sqlite3D
0560: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
0570: 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58  #define TRACE3(X
0580: 2c 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72  ,Y,Z) if( pPager
0590: 3d 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 73 71  ==mainPager ) sq
05a0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
05b0: 28 58 2c 59 2c 5a 29 0a 23 65 6c 73 65 0a 23 64  (X,Y,Z).#else.#d
05c0: 65 66 69 6e 65 20 53 45 54 5f 50 41 47 45 52 28  efine SET_PAGER(
05d0: 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52 5f 50  X).#define CLR_P
05e0: 41 47 45 52 28 58 29 0a 23 64 65 66 69 6e 65 20  AGER(X).#define 
05f0: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0600: 65 20 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  e TRACE2(X,Y).#d
0610: 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59  efine TRACE3(X,Y
0620: 2c 5a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ,Z).#endif.../*.
0630: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0640: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0650: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
0660: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
0670: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
0680: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
0690: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
06a0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
06b0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
06c0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
06d0: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
06e0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
06f0: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0700: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0710: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0720: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0730: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0740: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0760: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
0770: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
0780: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0790: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
07a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07c0: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
07d0: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
07e0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0800: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0810: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0820: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0830: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0840: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0850: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
0860: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
0870: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
0880: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
0890: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
08a0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
08b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
08c0: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
08d0: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
08e0: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
08f0: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0920: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0930: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0940: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0970: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0980: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
09b0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
09c0: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
09d0: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
09e0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
09f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0a00: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0a10: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0a20: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0a30: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0a60: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0a70: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0a80: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0aa0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0ab0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0ac0: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0af0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0b00: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0b10: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0b20: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0b30: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0b40: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0b60: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0b70: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0b80: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0bb0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0bc0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0bd0: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0bf0: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0c00: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0c10: 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20  emove the.**    
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
0c40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0c50: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20  ion will be.**  
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a       committed..
0c80: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0c90: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0ca0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0cb0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0cc0: 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
0cd0: 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  _get() occurs, t
0ce0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0cf0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0d00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0d10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0d20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0d30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0d40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0d50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0d60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0d70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0d80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0d90: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
0da0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  () is called, th
0db0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0dc0: 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  ons to.** PAGER_
0dd0: 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65  RESERVED.  (Note
0de0: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0df0: 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e  e_write() can on
0e00: 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20  ly be.** called 
0e10: 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  on an outstandin
0e20: 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61  g page which mea
0e30: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
0e40: 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20  r must.** be in 
0e50: 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66  PAGER_SHARED bef
0e60: 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f  ore it transitio
0e70: 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45  ns to PAGER_RESE
0e80: 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72  RVED.).** The tr
0e90: 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45  ansition to PAGE
0ea0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75  R_EXCLUSIVE occu
0eb0: 72 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61  rs when before a
0ec0: 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72  ny changes.** ar
0ed0: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
0ee0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66  tabase file.  Af
0ef0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61  ter an sqlite3pa
0f00: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a  ger_rollback().*
0f10: 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65  * or sqlite_page
0f20: 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20  r_commit(), the 
0f30: 73 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20  state goes back 
0f40: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
0f50: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
0f60: 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a  R_UNLOCK      0.
0f70: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48  #define PAGER_SH
0f80: 41 52 45 44 20 20 20 20 20 20 31 0a 23 64 65 66  ARED      1.#def
0f90: 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52 56  ine PAGER_RESERV
0fa0: 45 44 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20  ED    2.#define 
0fb0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
0fc0: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
0fd0: 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 34 0a  R_SYNCED      4.
0fe0: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d  ../*.** Each in-
0ff0: 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
1000: 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69  a page begins wi
1010: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1020: 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73   header..** This
1030: 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20   header is only 
1040: 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20  visible to this 
1050: 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54  pager module.  T
1060: 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64  he client.** cod
1070: 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67  e that calls pag
1080: 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65  er sees only the
1090: 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
10a0: 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  ws the header..*
10b0: 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65  *.** Client code
10c0: 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c   should call sql
10d0: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
10e0: 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f  ) on a page prio
10f0: 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61  r to making.** a
1100: 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ny modifications
1110: 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20   to that page.  
1120: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73  The first time s
1130: 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1140: 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  e().** is called
1150: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  , the original p
1160: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
1170: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1180: 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f  e rollback.** jo
1190: 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e  urnal and PgHdr.
11a0: 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67  inJournal and Pg
11b0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65  Hdr.needSync are
11c0: 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e   set.  Later, on
11d0: 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ce.** the journa
11e0: 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64 65 20  l page has made 
11f0: 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  it onto the disk
1200: 20 73 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e   surface, PgHdr.
1210: 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63  needSync.** is c
1220: 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64  leared.  The mod
1230: 69 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f  ified page canno
1240: 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63  t be written bac
1250: 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  k into the origi
1260: 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
1270: 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a  file until the j
1280: 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73  ournal pages has
1290: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
12a0: 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20  disk and the.** 
12b0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68  PgHdr.needSync h
12c0: 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e  as been cleared.
12d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72  .**.** The PgHdr
12e0: 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73 20 73  .dirty flag is s
12f0: 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33 70  et when sqlite3p
1300: 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
1310: 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73  called and.** is
1320: 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77   cleared again w
1330: 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e  hen the page con
1340: 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20  tent is written 
1350: 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67  back to the orig
1360: 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  inal.** database
1370: 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65   file..*/.typede
1380: 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50  f struct PgHdr P
1390: 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48  gHdr;.struct PgH
13a0: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
13b0: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
13c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
13d0: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
13e0: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
13f0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
1420: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
1430: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
1440: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
1450: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
1460: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
1470: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
1480: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46  .  PgHdr *pNextF
1490: 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b  ree, *pPrevFree;
14a0: 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66    /* Freelist of
14b0: 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
14c0: 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  f==0 */.  PgHdr 
14d0: 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20  *pNextAll;      
14e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69           /* A li
14f0: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
1500: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1510: 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d  tStmt, *pPrevStm
1520: 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70  t;  /* List of p
1530: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
1540: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ement journal */
1550: 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b  .  u8 inJournal;
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73    /* TRUE if has
1580: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1590: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
15a0: 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20   inStmt;        
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c0: 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20 73  TRUE if in the s
15d0: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
15e0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
15f0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1600: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1610: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
1620: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
1630: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
1640: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1650: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
1660: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
1670: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
1680: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
1690: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
16a0: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e    /* Disable don
16b0: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
16c0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
16d0: 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20  short int nRef; 
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  * Number of user
1700: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a  s of this page *
1710: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
1720: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1730: 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65     /* Dirty page
1740: 73 20 73 6f 72 74 65 64 20 62 79 20 50 67 48 64  s sorted by PgHd
1750: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 53  r.pgno */.  /* S
1760: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20  QLITE_PAGE_SIZE 
1770: 62 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61  bytes of page da
1780: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68  ta follow this h
1790: 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61  eader */.  /* Pa
17a0: 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
17b0: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66   of local data f
17c0: 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64  ollow the page d
17d0: 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ata */.};../*.**
17e0: 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
17f0: 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c  y only database,
1800: 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f   some extra info
1810: 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  rmation is recor
1820: 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63  ded about.** eac
1830: 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63  h page so that c
1840: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f  hanges can be ro
1850: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75  lled back.  (Jou
1860: 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e  rnal files are n
1870: 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69  ot.** used for i
1880: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1890: 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77  es.)  The follow
18a0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
18b0: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  is added to.** t
18c0: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
18d0: 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20  EXTRA block for 
18e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
18f0: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ses..**.** This 
1900: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c  information coul
1910: 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  d have been adde
1920: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
1930: 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  e PgHdr structur
1940: 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69  e..** But then i
1950: 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20  t would take up 
1960: 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73  an extra 8 bytes
1970: 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65   of storage on e
1980: 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76  very PgHdr.** ev
1990: 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65  en for disk-base
19a0: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70  d databases.  Sp
19b0: 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73  litting it out s
19c0: 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54  aves 8 bytes.  T
19d0: 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  his.** is only a
19e0: 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25   savings of 0.8%
19f0: 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65   but those perce
1a00: 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a  ntages add up..*
1a10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1a20: 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73   PgHistory PgHis
1a30: 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48  tory;.struct PgH
1a40: 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70  istory {.  u8 *p
1a50: 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69  Orig;     /* Ori
1a60: 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e  ginal page text.
1a70: 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69    Restore to thi
1a80: 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c  s on a full roll
1a90: 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53  back */.  u8 *pS
1aa0: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  tmt;     /* Text
1ab0: 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68   as it was at th
1ac0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
1ad0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1ae0: 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ment */.};../*.*
1af0: 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66  * A macro used f
1b00: 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  or invoking the 
1b10: 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69  codec if there i
1b20: 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20  s one.*/.#ifdef 
1b30: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
1b40: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28  .# define CODEC(
1b50: 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e  P,D,N,X) if( P->
1b60: 78 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f  xCodec ){ P->xCo
1b70: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
1b80: 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65  ,D,N,X); }.#else
1b90: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28  .# define CODEC(
1ba0: 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a  P,D,N,X).#endif.
1bb0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1bc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67   pointer to a Pg
1bd0: 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  Hdr into a point
1be0: 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a  er to its data.*
1bf0: 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e  * and back again
1c00: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48  ..*/.#define PGH
1c10: 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28  DR_TO_DATA(P)  (
1c20: 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29  (void*)(&(P)[1])
1c30: 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54  ).#define DATA_T
1c40: 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28  O_PGHDR(D)  (&((
1c50: 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29  PgHdr*)(D))[-1])
1c60: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
1c70: 4f 5f 45 58 54 52 41 28 50 29 20 28 28 76 6f 69  O_EXTRA(P) ((voi
1c80: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  d*)&((char*)(&(P
1c90: 29 5b 31 5d 29 29 5b 53 51 4c 49 54 45 5f 50 41  )[1]))[SQLITE_PA
1ca0: 47 45 5f 53 49 5a 45 5d 29 0a 23 64 65 66 69 6e  GE_SIZE]).#defin
1cb0: 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  e PGHDR_TO_HIST(
1cc0: 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20  P,PGR)  \.      
1cd0: 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72        ((PgHistor
1ce0: 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  y*)&((char*)(&(P
1cf0: 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61  )[1]))[(PGR)->pa
1d00: 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45  geSize+(PGR)->nE
1d10: 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f  xtra])../*.** Ho
1d20: 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68  w big to make th
1d30: 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65  e hash table use
1d40: 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69  d for locating i
1d50: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a  n-memory pages.*
1d60: 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  * by page number
1d70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50  ..*/.#define N_P
1d80: 47 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a 0a  G_HASH 2048../*.
1d90: 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e  ** Hash a page n
1da0: 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  umber.*/.#define
1db0: 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20   pager_hash(PN) 
1dc0: 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53   ((PN)&(N_PG_HAS
1dd0: 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f  H-1))../*.** A o
1de0: 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69  pen page cache i
1df0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1e00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1e10: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
1e20: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63 68  uct Pager {.  ch
1e30: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
1e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1e50: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1e60: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
1e70: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
1e80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1e90: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1ea0: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
1eb0: 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20  Directory;      
1ec0: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
1ed0: 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20  y hold database 
1ee0: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  and journal file
1ef0: 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66 64  s */.  OsFile fd
1f00: 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20  , jfd;          
1f10: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
1f20: 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62  iptors for datab
1f30: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
1f40: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74 66 64  */.  OsFile stfd
1f50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f60: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1f70: 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74  tor for the stat
1f80: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
1f90: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1fc0: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1fd0: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
1fe0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1ff0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
2000: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
2010: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ange */.  int st
2020: 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mtSize;         
2030: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2040: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
2050: 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67  ges) at stmt_beg
2060: 69 6e 28 29 20 2a 2f 0a 20 20 6f 66 66 5f 74 20  in() */.  off_t 
2070: 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20  stmtJSize;      
2080: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2090: 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74   journal at stmt
20a0: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  _begin() */.  in
20b0: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
20c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20d0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
20e0: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
20f0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
2100: 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
2110: 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61       /* Quasi-ra
2120: 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64  ndom value added
2130: 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73   to every checks
2140: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  um */.  int stmt
2150: 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  NRec;           
2160: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2170: 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74   records in stmt
2180: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
2190: 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20   int nExtra;    
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b0: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
21c0: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
21d0: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
21e0: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74  void (*xDestruct
21f0: 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20  or)(void*,int); 
2200: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
2210: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
2220: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
2230: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76  d (*xReiniter)(v
2240: 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20  oid*,int);   /* 
2250: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
2260: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
2270: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2280: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
2290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22a0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
22b0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  page */.  int nP
22c0: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
22d0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
22e0: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
22f0: 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  ry pages */.  in
2300: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
2310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2320: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2330: 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64   pages with PgHd
2340: 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e  r.nRef>0 */.  in
2350: 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20  t mxPage;       
2360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2370: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
2380: 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20  ages to hold in 
2390: 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cache */.  int n
23a0: 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66  Hit, nMiss, nOvf
23b0: 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20  l;     /* Cache 
23c0: 68 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61  hits, missing, a
23d0: 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73  nd LRU overflows
23e0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
23f0: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
2400: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
2410: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
2420: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
2430: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
2440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2450: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
2460: 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20  o xCodec() */.  
2470: 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20  u8 journalOpen; 
2480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2490: 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
24a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
24b0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38  is valid */.  u8
24c0: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
24d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24e0: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
24f0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2500: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
2510: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2520: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
2530: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
2540: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
2550: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
2560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2570: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
2580: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
2590: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
25a0: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
25b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
25c0: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
25d0: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
25e0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
25f0: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
2600: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
2610: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
2620: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
2630: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
2640: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2650: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2660: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
2670: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
2680: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
2690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
26a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
26b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
26c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
26d0: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
26e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
26f0: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
2700: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
2710: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 65 72 72  etc. */.  u8 err
2720: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
2730: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2740: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
2750: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20   errors */.  u8 
2760: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
2770: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
2780: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
2790: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
27a0: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27c0: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
27d0: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
27e0: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2800: 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63  True if an fsync
2810: 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  () is needed on 
2820: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
2830: 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20   u8 dirtyCache; 
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2850: 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70  True if cached p
2860: 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  ages have change
2870: 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  d */.  u8 always
2880: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2890: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f     /* Disable do
28a0: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
28b0: 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  r all pages */. 
28c0: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28e0: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
28f0: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
2900: 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c    u8 *aInJournal
2910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2920: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2930: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2940: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2950: 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20   u8 *aInStmt;   
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2970: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2980: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2990: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
29a0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
29b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29c0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 73   of bytes to res
29d0: 65 72 76 65 20 66 6f 72 20 6d 61 73 74 65 72 20  erve for master 
29e0: 6a 2e 70 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e  j.p */.  BusyHan
29f0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
2a00: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
2a10: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
2a20: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64 72  ndler */.  PgHdr
2a30: 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74   *pFirst, *pLast
2a40: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
2a50: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
2a60: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
2a70: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  ynced;        /*
2a80: 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65   First free page
2a90: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64   with PgHdr.need
2aa0: 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  Sync==0 */.  PgH
2ab0: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
2ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2ad0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
2ae0: 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b  .  PgHdr *pStmt;
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b00: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
2b10: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
2b20: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
2b30: 20 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f   PgHdr *aHash[N_
2b40: 50 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20  PG_HASH];    /* 
2b50: 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61  Hash table to ma
2b60: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  p page number to
2b70: 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   PgHdr */.};../*
2b80: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69  .** These are bi
2b90: 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ts that can be s
2ba0: 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d  et in Pager.errM
2bb0: 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask..*/.#define 
2bc0: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20  PAGER_ERR_FULL  
2bd0: 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72     0x01  /* a wr
2be0: 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  ite() failed */.
2bf0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
2c00: 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20  R_MEM      0x02 
2c10: 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   /* malloc() fai
2c20: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
2c30: 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20  AGER_ERR_LOCK   
2c40: 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72    0x04  /* error
2c50: 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
2c60: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66  protocol */.#def
2c70: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  ine PAGER_ERR_CO
2c80: 52 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20  RRUPT  0x08  /* 
2c90: 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72  database or jour
2ca0: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  nal corruption *
2cb0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
2cc0: 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31  ERR_DISK     0x1
2cd0: 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69  0  /* general di
2ce0: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62  sk I/O error - b
2cf0: 61 64 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a  ad hard drive? *
2d00: 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  /../*.** Journal
2d10: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
2d20: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
2d30: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
2d40: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
2d50: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
2d60: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
2d70: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
2d80: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
2d90: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
2da0: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
2db0: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
2dc0: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
2dd0: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
2de0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
2df0: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
2e00: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
2e10: 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a  urnal is begin.*
2e20: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
2e30: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
2e40: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
2e50: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
2e60: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
2e70: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
2e80: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
2e90: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
2ea0: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
2eb0: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
2ec0: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
2ed0: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
2ee0: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
2ef0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
2f00: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
2f10: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
2f20: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
2f30: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
2f40: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
2f50: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
2f60: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
2f70: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
2f80: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
2f90: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
2fa0: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
2fb0: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
2fc0: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
2fd0: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
2fe0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
2ff0: 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f 50 41  nd the SQLITE_PA
3000: 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66  GE_SIZE bytes of
3010: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
3020: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
3030: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
3040: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
3050: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
3060: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
3070: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
3080: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
3090: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
30a0: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
30b0: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
30c0: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
30d0: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
30e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
30f0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
3100: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
3110: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
3120: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
3130: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
3140: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
3150: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
3160: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
3170: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
3180: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
3190: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
31a0: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
31b0: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
31c0: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
31d0: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
31e0: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
31f0: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
3200: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
3210: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
3220: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
3230: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
3240: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
3250: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
3260: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
3270: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
3280: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
3290: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66  he header and of
32a0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
32b0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74  e journal is det
32c0: 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68  ermined.** by th
32d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
32e0: 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  os..*/.#define J
32f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
3300: 61 67 65 72 29 20 28 32 34 20 2b 20 28 70 50 61  ager) (24 + (pPa
3310: 67 65 72 29 2d 3e 6e 4d 61 73 74 65 72 29 0a 23  ger)->nMaster).#
3320: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
3330: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
3340: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
3350: 29 20 2b 20 38 29 0a 0a 0a 2f 2a 0a 2a 2a 20 45  ) + 8).../*.** E
3360: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
3370: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
3380: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
3390: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
33a0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
33b0: 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f   pager3_refinfo_
33c0: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
33d0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
33e0: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
33f0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
3400: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
3410: 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e  f( !pager3_refin
3420: 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75  fo_enable ) retu
3430: 72 6e 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 0a  rn;.    printf(.
3440: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
3450: 25 34 64 20 61 64 64 72 3d 30 78 25 30 38 78 20  %4d addr=0x%08x 
3460: 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  nRef=%d\n",.    
3470: 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74     p->pgno, (int
3480: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
3490: 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29  ), p->nRef.    )
34a0: 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f  ;.    cnt++;   /
34b0: 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73  * Something to s
34c0: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
34d0: 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69  on */.  }.# defi
34e0: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70  ne REFINFO(X)  p
34f0: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a  ager_refinfo(X).
3500: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52  #else.# define R
3510: 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66  EFINFO(X).#endif
3520: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
3530: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
3540: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
3550: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
3560: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
3570: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
3580: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
3590: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
35a0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
35b0: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
35c0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
35d0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
35e0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
35f0: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
3600: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
3610: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
3620: 20 72 65 61 64 33 32 62 69 74 73 28 4f 73 46 69   read32bits(OsFi
3630: 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65  le *fd, u32 *pRe
3640: 73 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20  s){.  u32 res;. 
3650: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
3660: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
3670: 2c 20 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72  , &res, sizeof(r
3680: 65 73 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  es));.  if( rc==
3690: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
36b0: 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  c[4];.    memcpy
36c0: 28 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20  (ac, &res, 4);. 
36d0: 20 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c     res = (ac[0]<
36e0: 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31  <24) | (ac[1]<<1
36f0: 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20  6) | (ac[2]<<8) 
3700: 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a  | ac[3];.  }.  *
3710: 70 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65  pRes = res;.  re
3720: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3730: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
3740: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
3750: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
3760: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
3770: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
3780: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
3790: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
37a0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
37b0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
37c0: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
37d0: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
37e0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
37f0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30  ar ac[4];.  ac[0
3800: 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20  ] = (val>>24) & 
3810: 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20  0xff;.  ac[1] = 
3820: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
3830: 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c  ;.  ac[2] = (val
3840: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >>8) & 0xff;.  a
3850: 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66  c[3] = val & 0xf
3860: 66 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  f;.  return sqli
3870: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
3880: 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c, 4);.}../*.** 
3890: 57 72 69 74 65 20 74 68 65 20 33 32 2d 62 69 74  Write the 32-bit
38a0: 20 69 6e 74 65 67 65 72 20 27 76 61 6c 27 20 69   integer 'val' i
38b0: 6e 74 6f 20 74 68 65 20 70 61 67 65 20 69 64 65  nto the page ide
38c0: 6e 74 69 66 69 65 64 20 62 79 20 70 61 67 65 20  ntified by page 
38d0: 68 65 61 64 65 72 0a 2a 2a 20 27 70 27 20 61 74  header.** 'p' at
38e0: 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27   offset 'offset'
38f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3900: 20 73 74 6f 72 65 33 32 62 69 74 73 28 75 33 32   store32bits(u32
3910: 20 76 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20   val, PgHdr *p, 
3920: 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75  int offset){.  u
3930: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63  nsigned char *ac
3940: 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69  ;.  ac = &((unsi
3950: 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52  gned char*)PGHDR
3960: 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66  _TO_DATA(p))[off
3970: 73 65 74 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20  set];.  ac[0] = 
3980: 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66  (val>>24) & 0xff
3990: 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c  ;.  ac[1] = (val
39a0: 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20  >>16) & 0xff;.  
39b0: 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29  ac[2] = (val>>8)
39c0: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d   & 0xff;.  ac[3]
39d0: 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d   = val & 0xff;.}
39e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
39f0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61 74  2-bit integer at
3a00: 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27   offset 'offset'
3a10: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
3a20: 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
3a30: 70 61 67 65 20 68 65 61 64 65 72 20 27 70 27 2e  page header 'p'.
3a40: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72  .*/.static u32 r
3a50: 65 74 72 69 65 76 65 33 32 62 69 74 73 28 50 67  etrieve32bits(Pg
3a60: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
3a70: 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  et){.  unsigned 
3a80: 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d  char *ac;.  ac =
3a90: 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61   &((unsigned cha
3aa0: 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
3ab0: 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  (p))[offset];.  
3ac0: 72 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32  return (ac[0]<<2
3ad0: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
3ae0: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
3af0: 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ac[3];.}.../*.**
3b00: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74   Convert the bit
3b10: 73 20 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d  s in the pPager-
3b20: 3e 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e  >errMask into an
3b30: 20 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72   approprate.** r
3b40: 65 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73  eturn code..*/.s
3b50: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
3b60: 65 72 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70  errcode(Pager *p
3b70: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
3b80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3b90: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
3ba0: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
3bb0: 4c 4f 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53  LOCK )    rc = S
3bc0: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a  QLITE_PROTOCOL;.
3bd0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
3be0: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
3bf0: 52 5f 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d  R_DISK )    rc =
3c00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
3c10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
3c20: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
3c30: 5f 46 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20  _FULL )    rc = 
3c40: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69  SQLITE_FULL;.  i
3c50: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
3c60: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d  sk & PAGER_ERR_M
3c70: 45 4d 20 29 20 20 20 20 20 72 63 20 3d 20 53 51  EM )     rc = SQ
3c80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66  LITE_NOMEM;.  if
3c90: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
3ca0: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  k & PAGER_ERR_CO
3cb0: 52 52 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c  RRUPT ) rc = SQL
3cc0: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72  ITE_CORRUPT;.  r
3cd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3ce0: 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65  ** Add or remove
3cf0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
3d00: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
3d10: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  es that are in t
3d20: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
3d30: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
3d40: 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61  he Pager keeps a
3d50: 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f   separate list o
3d60: 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  f pages that are
3d70: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a   currently in.**
3d80: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
3d90: 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65  ournal.  This he
3da0: 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 70  lps the sqlite3p
3db0: 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
3dc0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
3dd0: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
3de0: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
3df0: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
3e00: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
3e10: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
3e20: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
3e30: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
3e40: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
3e50: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
3e60: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
3e70: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
3e80: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
3e90: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
3ea0: 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75  g->inStmt ) retu
3eb0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rn;.  assert( pP
3ec0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20  g->pPrevStmt==0 
3ed0: 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  && pPg->pNextStm
3ee0: 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  t==0 );.  pPg->p
3ef0: 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20  PrevStmt = 0;.  
3f00: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  if( pPager->pStm
3f10: 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  t ){.    pPager-
3f20: 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  >pStmt->pPrevStm
3f30: 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  t = pPg;.  }.  p
3f40: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
3f50: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20  pPager->pStmt;. 
3f60: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
3f70: 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53   pPg;.  pPg->inS
3f80: 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69  tmt = 1;.}.stati
3f90: 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f  c void page_remo
3fa0: 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
3fb0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
3fc0: 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d   if( !pPg->inStm
3fd0: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  t ) return;.  if
3fe0: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
3ff0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4000: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e  pPg->pPrevStmt->
4010: 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29  pNextStmt==pPg )
4020: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
4030: 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Stmt->pNextStmt 
4040: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
4050: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
4060: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
4070: 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29  er->pStmt==pPg )
4080: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
4090: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e  r->pStmt = pPg->
40a0: 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20  pNextStmt;.  }. 
40b0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53   if( pPg->pNextS
40c0: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
40d0: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  t( pPg->pNextStm
40e0: 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50  t->pPrevStmt==pP
40f0: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  g );.    pPg->pN
4100: 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  extStmt->pPrevSt
4110: 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53  mt = pPg->pPrevS
4120: 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  tmt;.  }.  pPg->
4130: 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
4140: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
4150: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74  = 0;.  pPg->inSt
4160: 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mt = 0;.}../*.**
4170: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
4180: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
4190: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
41a0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
41b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
41c0: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
41d0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
41e0: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
41f0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
4200: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
4210: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
4220: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
4230: 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f  [pager_hash(pgno
4240: 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26  )];.  while( p &
4250: 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20  & p->pgno!=pgno 
4260: 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  ){.    p = p->pN
4270: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72  extHash;.  }.  r
4280: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
4290: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
42a0: 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20  abase and clear 
42b0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
42c0: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
42d0: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
42e0: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
42f0: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
4300: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
4310: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
4320: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
4330: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
4340: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
4350: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
4360: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
4370: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
4380: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
4390: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
43a0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
43b0: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
43c0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
43d0: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
43e0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
43f0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
4400: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
4410: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
4420: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
4430: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61  (pPg);.  }.  pPa
4440: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
4450: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
4460: 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70  tSynced = 0;.  p
4470: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
4480: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  ;.  pPager->pAll
4490: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70   = 0;.  memset(p
44a0: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
44b0: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
44c0: 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65  aHash));.  pPage
44d0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
44e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
44f0: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
4500: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
4510: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
4520: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
4530: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
4540: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
4550: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
4560: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
4570: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  OCK;.  pPager->d
4580: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50  bSize = -1;.  pP
4590: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
45a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
45b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
45c0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65   );.}../*.** Whe
45d0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
45e0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
45f0: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
4600: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
4610: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
4620: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
4630: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
4640: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
4650: 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65   releases.** the
4660: 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61   database lock a
4670: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48  nd acquires a SH
4680: 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73  ARED lock in its
4690: 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75   place.  The jou
46a0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20  rnal.** file is 
46b0: 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73  deleted and clos
46c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
46d0: 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67  Consider keeping
46e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
46f0: 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f  e open for tempo
4700: 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a  rary databases..
4710: 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69  ** This might gi
4720: 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
4730: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20   improvement on 
4740: 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70  windows where op
4750: 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20  ening.** a file 
4760: 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20  is an expensive 
4770: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
4780: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75  atic int pager_u
4790: 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72  nwritelock(Pager
47a0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
47b0: 64 72 20 2a 70 50 67 3b 0a 20 20 69 66 28 20 70  dr *pPg;.  if( p
47c0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
47d0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
47e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
47f0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
4800: 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
4810: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
4820: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
4830: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
4840: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
4850: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
4860: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
4870: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
4880: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
4890: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
48a0: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
48b0: 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  >jfd);.    pPage
48c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
48d0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   0;.    sqlite3O
48e0: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
48f0: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73  zJournal);.    s
4900: 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
4910: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->aInJournal );
4920: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
4930: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
4940: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
4950: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
4960: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
4970: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
4980: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
4990: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
49a0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
49b0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
49c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
49d0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
49e0: 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
49f0: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
4a00: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  =0 );.  }.  sqli
4a10: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
4a20: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
4a30: 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d  LOCK);.  pPager-
4a40: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
4a50: 48 41 52 45 44 3b 0a 20 20 72 65 74 75 72 6e 20  HARED;.  return 
4a60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4a70: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  .** Compute and 
4a80: 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
4a90: 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f  m for the page o
4aa0: 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  f data..**.** Th
4ab0: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
4ac0: 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69   checksum.  It i
4ad0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
4ae0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
4af0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
4b00: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61  value and the pa
4b10: 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65  ge number.  We e
4b20: 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68  xperimented with
4b30: 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f  .** a checksum o
4b40: 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74  f the entire dat
4b50: 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20  a, but that was 
4b60: 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20  found to be too 
4b70: 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  slow..**.** Note
4b80: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
4b90: 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20  umber is stored 
4ba0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
4bb0: 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20   of data and.** 
4bc0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  the checksum is 
4bd0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
4be0: 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f  d.  This is impo
4bf0: 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e  rtant.  If journ
4c00: 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  al.** corruption
4c10: 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
4c20: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
4c30: 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
4c40: 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74  scenario.** is t
4c50: 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
4c60: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
4c70: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
4c80: 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a  hanged.  It is.*
4c90: 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  * much less like
4ca0: 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
4cb0: 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
4cc0: 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
4cd0: 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
4ce0: 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
4cf0: 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
4d00: 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
4d10: 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
4d20: 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
4d30: 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
4d40: 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
4d50: 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
4d60: 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20  .**.** FIX ME:  
4d70: 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  Consider adding 
4d80: 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20  every 200th (or 
4d90: 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20  so) byte of the 
4da0: 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63  data to the.** c
4db0: 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77  hecksum.  That w
4dc0: 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70  ay if a single p
4dd0: 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d  age spans 3 or m
4de0: 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  ore disk sectors
4df0: 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65   and.** only the
4e00: 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69   middle sector i
4e10: 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69  s corrupt, we wi
4e20: 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20  ll still have a 
4e30: 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68  reasonable.** ch
4e40: 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20  ance of failing 
4e50: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64  the checksum and
4e60: 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20   thus detecting 
4e70: 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  the problem..*/.
4e80: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
4e90: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
4ea0: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
4eb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61   const char *aDa
4ec0: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
4ed0: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
4ee0: 49 6e 69 74 20 2b 20 70 67 6e 6f 3b 0a 20 20 72  Init + pgno;.  r
4ef0: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
4f00: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
4f10: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
4f20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
4f30: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
4f40: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
4f50: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
4f60: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
4f70: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
4f80: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
4f90: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
4fa0: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
4fb0: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
4fc0: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
4fd0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
4fe0: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
4ff0: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
5000: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
5010: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
5020: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
5030: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
5040: 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a  one_page(Pager *
5050: 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a  pPager, OsFile *
5060: 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75  jfd, int useCksu
5070: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
5080: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
50a0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
50b0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
50c0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50e0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
50f0: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
5100: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
5110: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5130: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
5140: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
5150: 67 20 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b  g */.  u8 aData[
5160: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
5170: 5d 3b 20 20 20 2f 2a 20 53 74 6f 72 65 20 64 61  ];   /* Store da
5180: 74 61 20 68 65 72 65 20 2a 2f 0a 0a 20 20 72 63  ta here */..  rc
5190: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
51a0: 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  d, &pgno);.  if(
51b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
51c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
51d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
51e0: 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70 50  (jfd, &aData, pP
51f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
5200: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5210: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
5220: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
5230: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
5240: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
5250: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
5260: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
5270: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
5280: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
5290: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
52a0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
52b0: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
52c0: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
52d0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
52e0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
52f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
5300: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
5310: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
5320: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
5330: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
5340: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
5350: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
5360: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5370: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
5380: 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69    if( pgno>(unsi
5390: 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
53a0: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
53b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
53c0: 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20  .  if( useCksum 
53d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
53e0: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73  32bits(jfd, &cks
53f0: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
5400: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
5410: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
5420: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 61  (pPager, pgno, a
5430: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
5440: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5450: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
5460: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
5470: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
5480: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
5490: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
54a0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
54b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
54c0: 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
54d0: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
54e0: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
54f0: 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
5500: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
5510: 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
5520: 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
5530: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
5540: 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
5550: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5560: 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
5570: 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
5580: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
5590: 2a 0a 20 20 2a 2a 20 46 49 58 20 4d 45 3a 20 49  *.  ** FIX ME: I
55a0: 64 65 61 6c 6c 79 20 74 68 65 20 70 61 67 65 20  deally the page 
55b0: 77 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6c 65  would only be le
55c0: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
55d0: 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 70 61  when the.  ** pa
55e0: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
55f0: 45 44 20 73 74 61 74 65 20 69 66 20 69 74 20 77  ED state if it w
5600: 61 73 20 64 69 72 74 79 20 77 68 65 6e 20 74 68  as dirty when th
5610: 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  is statement.  *
5620: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
5630: 73 20 73 74 61 72 74 65 64 2e 20 0a 20 20 2a 2a  s started. .  **
5640: 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c  .  ** If in EXCL
5650: 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65  USIVE state, the
5660: 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20  n we update the 
5670: 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
5680: 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e  t exists.  ** an
5690: 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
56a0: 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
56b0: 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72  n marked not dir
56c0: 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  ty..  */.  pPg =
56d0: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
56e0: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
56f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
5700: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
5710: 55 53 49 56 45 20 7c 7c 20 70 50 67 20 29 3b 0a  USIVE || pPg );.
5720: 20 20 54 52 41 43 45 32 28 22 50 4c 41 59 42 41    TRACE2("PLAYBA
5730: 43 4b 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  CK page %d\n", p
5740: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67  gno);.  if( pPag
5750: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
5760: 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
5770: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
5780: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
5790: 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
57a0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
57b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
57c0: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
57d0: 3e 66 64 2c 20 61 44 61 74 61 2c 20 53 51 4c 49  >fd, aData, SQLI
57e0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
57f0: 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
5800: 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
5810: 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 72 6f  hould ever be ro
5820: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
5830: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
5840: 20 66 6f 72 20 70 61 67 65 0a 20 20 20 20 2a 2a   for page.    **
5850: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
5860: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
5870: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
5880: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
5890: 65 0a 20 20 20 20 2a 2a 20 61 63 74 69 76 65 2e  e.    ** active.
58a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
58b0: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 61 73 73   *pData;.    ass
58c0: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
58d0: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
58e0: 31 20 29 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  1 );.    pData =
58f0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
5900: 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  Pg);.    memcpy(
5910: 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50  pData, aData, pP
5920: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
5930: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
5940: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20  >xDestructor ){ 
5950: 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53   /*** FIX ME:  S
5960: 68 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78 52  hould this be xR
5970: 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20  einit? ***/.    
5980: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
5990: 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61  uctor(pData, pPa
59a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
59b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
59c0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
59d0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
59e0: 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
59f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
5a00: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
5a10: 20 20 20 7d 0a 20 20 20 20 43 4f 44 45 43 28 70     }.    CODEC(p
5a20: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
5a30: 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d  g->pgno, 3);.  }
5a40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5a50: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
5a60: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
5a70: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
5a80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
5a90: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
5aa0: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
5ab0: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
5ac0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5ad0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
5ae0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
5af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
5b00: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
5b10: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
5b20: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5b30: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
5b40: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
5b50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
5b60: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
5b70: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
5b80: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
5b90: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
5ba0: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
5bb0: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
5bc0: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
5bd0: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
5be0: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
5bf0: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
5c00: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
5c10: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
5c20: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
5c30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
5c40: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
5c50: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
5c60: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
5c70: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
5c80: 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61  master(const cha
5c90: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
5ca0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73  nt rc;.  int mas
5cb0: 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  ter_open = 0;.  
5cc0: 4f 73 46 69 6c 65 20 6d 61 73 74 65 72 3b 0a 20  OsFile master;. 
5cd0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
5ce0: 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
5cf0: 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
5d00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
5d10: 0a 20 20 6f 66 66 5f 74 20 6e 4d 61 73 74 65 72  .  off_t nMaster
5d20: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 2f 2a 20  Journal;     /* 
5d30: 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
5d40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a  ournal file */..
5d50: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
5d60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5d70: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
5d80: 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72   case some other
5d90: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73   process.  ** is
5da0: 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f   running this ro
5db0: 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20  utine also. Not 
5dc0: 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f  that it makes to
5dd0: 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63  o much differenc
5de0: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
5df0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
5e00: 75 73 69 76 65 28 7a 4d 61 73 74 65 72 2c 20 26  usive(zMaster, &
5e10: 6d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 69 66  master, 0);.  if
5e20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5e30: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
5e40: 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f  _out;.  master_o
5e50: 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d  pen = 1;..  rc =
5e60: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
5e70: 7a 65 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(&master, &nMa
5e80: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
5e90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5ea0: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
5eb0: 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
5ec0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
5ed0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
5ee0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ;.    zMasterJou
5ef0: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
5f00: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
5f10: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
5f20: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
5f30: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
5f40: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
5f50: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
5f60: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
5f70: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
5f80: 33 4f 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c  3OsRead(&master,
5f90: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
5fa0: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29   nMasterJournal)
5fb0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
5fc0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
5fd0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
5fe0: 20 20 20 7a 44 62 20 3d 20 7a 4d 61 73 74 65 72     zDb = zMaster
5ff0: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
6000: 6c 65 28 20 28 7a 44 62 2d 7a 4d 61 73 74 65 72  le( (zDb-zMaster
6010: 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
6020: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
6030: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 20   char *zJournal 
6040: 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 2a 2a 20  = 0;.      /*** 
6050: 46 49 58 20 4d 45 3a 20 20 53 74 6f 72 65 20 74  FIX ME:  Store t
6060: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
6070: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6d 61 73 74  name in the mast
6080: 65 72 20 6a 6f 75 72 6e 61 6c 2c 0a 20 20 20 20  er journal,.    
6090: 20 20 2a 2a 2a 2a 20 6e 6f 74 20 6a 75 73 74 20    **** not just 
60a0: 74 68 65 20 62 61 73 65 20 64 61 74 61 62 61 73  the base databas
60b0: 65 20 6e 61 6d 65 2e 20 2a 2a 2a 2f 0a 20 20 20  e name. ***/.   
60c0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
60d0: 69 6e 67 28 26 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ing(&zJournal, z
60e0: 44 62 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  Db, "-journal", 
60f0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  0);.      if( !z
6100: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
6110: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6120: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f  OMEM;.        go
6130: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
6140: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6150: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
6160: 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c  eExists(zJournal
6170: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
6180: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
6190: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
61a0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
61b0: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
61c0: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
61d0: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
61e0: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
61f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
6200: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
6210: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
6220: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
6230: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
6240: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6250: 20 20 20 20 4f 73 46 69 6c 65 20 6a 6f 75 72 6e      OsFile journ
6260: 61 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  al;.        int 
6270: 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20 20 20  nMaster;.       
6280: 20 6f 66 66 5f 74 20 6a 73 7a 3b 0a 0a 20 20 20   off_t jsz;..   
6290: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
62a0: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
62b0: 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e  zJournal, &journ
62c0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  al);.        sql
62d0: 69 74 65 46 72 65 65 28 7a 4a 6f 75 72 6e 61 6c  iteFree(zJournal
62e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
62f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6300: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6310: 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61  3OsClose(&journa
6320: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  l);.          go
6330: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
6340: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09 2f 2a  ;.        }.../*
6350: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69   Check if the fi
6360: 6c 65 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  le is big enough
6370: 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
6380: 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a   file.        **
6390: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 69 72   with the requir
63a0: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
63b0: 6c 20 6e 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20  l name. If not, 
63c0: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 20 20 20  ignore it..     
63d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
63e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
63f0: 53 69 7a 65 28 26 6a 6f 75 72 6e 61 6c 2c 20 26  Size(&journal, &
6400: 6a 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jsz);.        if
6410: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6420: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6430: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75  ite3OsClose(&jou
6440: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  rnal);.         
6450: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
6460: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
6470: 20 20 20 20 20 20 20 69 66 28 20 6a 73 7a 3c 28         if( jsz<(
6480: 32 35 2b 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65  25+strlen(zMaste
6490: 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r)) ){.         
64a0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
64b0: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
64c0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
64d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
64e0: 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65   .        /* See
64f0: 6b 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 69  k to the point i
6500: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  n the journal wh
6510: 65 72 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ere the master j
6520: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 20 20  ournal name.    
6530: 20 20 20 20 2a 2a 20 69 73 20 73 74 6f 72 65 64      ** is stored
6540: 2e 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  . Read the maste
6550: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
6560: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
6570: 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ned.        ** f
6580: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 20 20 20 20  rom malloc..    
6590: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
65a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
65b0: 6b 28 26 6a 6f 75 72 6e 61 6c 2c 20 32 30 29 3b  k(&journal, 20);
65c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
65d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
65e0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
65f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
6600: 61 64 33 32 62 69 74 73 28 26 6a 6f 75 72 6e 61  ad32bits(&journa
6610: 6c 2c 20 28 75 33 32 2a 29 26 6e 4d 61 73 74 65  l, (u32*)&nMaste
6620: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
6630: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6640: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
6650: 75 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ut;.        if( 
6660: 6e 4d 61 73 74 65 72 3e 30 20 26 26 20 6e 4d 61  nMaster>0 && nMa
6670: 73 74 65 72 3e 3d 73 74 72 6c 65 6e 28 7a 4d 61  ster>=strlen(zMa
6680: 73 74 65 72 29 2b 31 20 29 7b 0a 20 20 20 20 20  ster)+1 ){.     
6690: 20 20 20 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45       /*** FIX ME
66a0: 3a 20 43 6f 6e 73 69 64 65 72 20 61 6c 6c 6f 63  : Consider alloc
66b0: 61 74 69 6e 67 20 74 68 69 73 20 73 70 61 63 65  ating this space
66c0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
66d0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 2a 2a  e.          ****
66e0: 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61   space is alloca
66f0: 74 65 64 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ted for holding 
6700: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
6710: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
6720: 2f 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  /.          char
6730: 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 28   *zMasterPtr = (
6740: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
6750: 6c 6f 63 28 6e 4d 61 73 74 65 72 29 3b 0a 20 20  loc(nMaster);.  
6760: 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61          if( !zMa
6770: 73 74 65 72 50 74 72 20 29 7b 0a 20 20 20 20 20  sterPtr ){.     
6780: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6790: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
67a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
67b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
67c0: 61 64 28 26 6a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  ad(&journal, zMa
67d0: 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
67e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
67f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6800: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
6810: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
6820: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ptr);.          
6830: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
6840: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
6850: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
6860: 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 4d 61 73 74  0==strncmp(zMast
6870: 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 2c 20  erPtr, zMaster, 
6880: 6e 4d 61 73 74 65 72 29 20 29 7b 0a 20 20 20 20  nMaster) ){.    
6890: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
68a0: 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
68b0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
68c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
68d0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
68e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
68f0: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
6900: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
6910: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
6920: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 44        }.      zD
6940: 62 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 44 62  b += (strlen(zDb
6950: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
6960: 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65    .  sqlite3OsDe
6970: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a  lete(zMaster);..
6980: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
6990: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
69a0: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
69b0: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  eFree(zMasterJou
69c0: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
69d0: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
69e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
69f0: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
6a00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76  }../*.** Make ev
6a20: 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
6a30: 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68  cache agree with
6a40: 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
6a50: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
6a60: 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65  s,.** reread the
6a70: 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74   disk to reset t
6a80: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
6a90: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
6aa0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
6ab0: 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  led after a roll
6ac0: 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f  back in which so
6ad0: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20  me of the dirty 
6ae0: 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68  cache.** pages h
6af0: 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ad never been wr
6b00: 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73  itten out to dis
6b10: 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  k.  We need to r
6b20: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  oll back the.** 
6b30: 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  cache content an
6b40: 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61  d the easiest wa
6b50: 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20  y to do that is 
6b60: 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c  to reread the ol
6b70: 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63  d content.** bac
6b80: 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e  k from the disk.
6b90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6ba0: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
6bb0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
6bc0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
6bd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6be0: 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d  E_OK;.  for(pPg=
6bf0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
6c00: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
6c10: 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20  tAll){.    char 
6c20: 7a 42 75 66 5b 53 51 4c 49 54 45 5f 50 41 47 45  zBuf[SQLITE_PAGE
6c30: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20  _SIZE];.    if( 
6c40: 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f  !pPg->dirty ) co
6c50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
6c60: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
6c70: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
6c80: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
6c90: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
6ca0: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
6cb0: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
6cc0: 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b  )(pPg->pgno-1));
6cd0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6ce0: 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
6cf0: 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 53 51 4c  r->fd, zBuf, SQL
6d00: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
6d10: 20 20 20 20 20 20 54 52 41 43 45 32 28 22 52 45        TRACE2("RE
6d20: 46 45 54 43 48 20 70 61 67 65 20 25 64 5c 6e 22  FETCH page %d\n"
6d30: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
6d40: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
6d50: 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e  , zBuf, pPg->pgn
6d60: 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 2);.      if(
6d70: 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
6d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
6d90: 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 53 51  mset(zBuf, 0, SQ
6da0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
6db0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6dc0: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d  Pg->nRef==0 || m
6dd0: 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44  emcmp(zBuf, PGHD
6de0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
6df0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
6e00: 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) ){.      memcp
6e10: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
6e20: 70 50 67 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49  pPg), zBuf, SQLI
6e30: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
6e40: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
6e50: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
6e60: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
6e70: 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f  einiter(PGHDR_TO
6e80: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
6e90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
6ea0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6eb0: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
6ec0: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20  _TO_EXTRA(pPg), 
6ed0: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
6ee0: 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
6ef0: 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  }.    pPg->needS
6f00: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ync = 0;.    pPg
6f10: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d  ->dirty = 0;.  }
6f20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6f30: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
6f40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
6f50: 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
6f60: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6f70: 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
6f80: 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
6f90: 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
6fa0: 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
6fb0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
6fc0: 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
6fd0: 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
6fe0: 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
6ff0: 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
7000: 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
7010: 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
7020: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
7030: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
7040: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
7050: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
7060: 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
7070: 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
7080: 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
7090: 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
70a0: 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
70b0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
70c0: 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
70d0: 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
70e0: 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
70f0: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
7100: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
7110: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
7120: 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
7130: 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
7140: 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
7150: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
7160: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
7170: 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
7180: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
7190: 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
71a0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
71b0: 20 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74   (5)  4 byte int
71c0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
71d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
71e0: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  s in the master 
71f0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
7200: 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75   name.  The valu
7210: 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69  e may be zero (i
7220: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
7230: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a  re is no master.
7240: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
7250: 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79  .).**  (6)  N by
7260: 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  tes of the maste
7270: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
7280: 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62   The name will b
7290: 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  e nul-terminated
72a0: 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69  .**       and mi
72b0: 67 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74  ght be shorter t
72c0: 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  han the value re
72d0: 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66  ad from (5).  If
72e0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
72f0: 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20  **       of the 
7300: 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65  name is \000 the
7310: 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  n there is no ma
7320: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ster journal.  T
7330: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  he master.**    
7340: 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20     journal name 
7350: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46  is stored in UTF
7360: 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72  -8..**  (7)  Zer
7370: 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
7380: 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
7390: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
73a0: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
73b0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
73c0: 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
73d0: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
73e0: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
73f0: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
7400: 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
7410: 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
7420: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7430: 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
7440: 72 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76  rst 6 items abov
7450: 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
7460: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
7470: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
7480: 66 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a  f the 7th item..
7490: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
74a0: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
74b0: 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
74c0: 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
74d0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
74e0: 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
74f0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
7500: 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
7510: 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
7520: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
7530: 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
7540: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
7550: 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
7560: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
7570: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
7580: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
7590: 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
75a0: 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
75b0: 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
75c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
75d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
75e0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
75f0: 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
7600: 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
7610: 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
7620: 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
7630: 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
7640: 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
7650: 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
7660: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
7670: 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
7680: 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
7690: 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
76a0: 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
76b0: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
76c0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
76d0: 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
76e0: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
76f0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
7700: 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
7710: 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
7720: 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
7730: 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
7740: 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
7750: 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
7760: 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
7770: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
7780: 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
7790: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
77a0: 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
77b0: 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
77c0: 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
77d0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
77e0: 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
77f0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
7800: 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
7810: 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
7820: 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
7830: 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
7840: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
7850: 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
7860: 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
7870: 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 74 68 65  al file then the
7880: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 6c   database will l
7890: 69 6b 65 6c 79 20 61 6c 72 65 61 64 79 20 62 65  ikely already be
78a0: 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 73  .** corrupted, s
78b0: 6f 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f  o the PAGER_ERR_
78c0: 43 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73  CORRUPT bit is s
78d0: 65 74 20 69 6e 20 70 50 61 67 65 72 2d 3e 65 72  et in pPager->er
78e0: 72 4d 61 73 6b 0a 2a 2a 20 61 6e 64 20 53 51 4c  rMask.** and SQL
78f0: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
7900: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20  eturned.  If it 
7910: 61 6c 6c 20 77 6f 72 6b 73 2c 20 74 68 65 6e 20  all works, then 
7920: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
7930: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
7940: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
7950: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
7960: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
7970: 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a  nt useJournalSiz
7980: 65 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b  e){.  off_t szJ;
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79a0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
79b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
79c0: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  tes */.  int nRe
79d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
79e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
79f0: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
7a00: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
7a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7a20: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7a30: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
7a40: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
7a50: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
7a60: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
7a70: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 6e 73  n pages */.  uns
7a80: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
7a90: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
7aa0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
7ab0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
7ac0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
7ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
7ae0: 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
7af0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
7b00: 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
7b10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7b20: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
7b30: 6e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  name of master j
7b40: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 63 68 61 72  ournal */.  char
7b50: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
7b60: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7b70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7b80: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
7b90: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
7ba0: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
7bb0: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
7bc0: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
7bd0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
7be0: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
7bf0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
7c00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
7c10: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  n );.  sqlite3Os
7c20: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
7c30: 64 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  d, 0);.  rc = sq
7c40: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
7c50: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  &pPager->jfd, &s
7c60: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
7c70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7c80: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
7c90: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
7ca0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7cb0: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f   is too small to
7cc0: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c   contain a compl
7cd0: 65 74 65 20 68 65 61 64 65 72 2c 0a 20 20 2a 2a  ete header,.  **
7ce0: 20 69 74 20 6d 75 73 74 20 6d 65 61 6e 20 74 68   it must mean th
7cf0: 61 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  at the process t
7d00: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20  hat created the 
7d10: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
7d20: 0a 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  .  ** beginning 
7d30: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  to write the jou
7d40: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
7d50: 74 20 64 69 65 64 2e 20 20 49 6e 20 74 68 61 74  t died.  In that
7d60: 20 63 61 73 65 2c 0a 20 20 2a 2a 20 74 68 65 20   case,.  ** the 
7d70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
7d80: 6f 75 6c 64 20 68 61 76 65 20 73 74 69 6c 6c 20  ould have still 
7d90: 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20  been completely 
7da0: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 20  unchanged..  ** 
7db0: 4e 6f 74 68 69 6e 67 20 6e 65 65 64 73 20 74 6f  Nothing needs to
7dc0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
7dd0: 20 20 57 65 20 63 61 6e 20 73 61 66 65 6c 79 20    We can safely 
7de0: 69 67 6e 6f 72 65 20 74 68 69 73 20 6a 6f 75 72  ignore this jour
7df0: 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
7e00: 73 7a 4a 20 3c 20 32 34 20 29 7b 0a 20 20 20 20  szJ < 24 ){.    
7e10: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
7e20: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 28 31 29  k;.  }..  /* (1)
7e30: 20 52 65 61 64 20 74 68 65 20 62 65 67 69 6e 6e   Read the beginn
7e40: 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
7e50: 61 6c 20 61 6e 64 20 76 65 72 69 66 79 20 74 68  al and verify th
7e60: 65 20 6d 61 67 69 63 20 73 74 72 69 6e 67 0a 20  e magic string. 
7e70: 20 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e   ** at the begin
7e80: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
7e90: 6e 61 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  nal. */.  rc = s
7ea0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
7eb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
7ec0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
7ed0: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
7ee0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d  LITE_OK || memcm
7ef0: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
7f00: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
7f10: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
7f20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
7f30: 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74  ROTOCOL;.    got
7f40: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
7f50: 20 20 7d 0a 0a 20 20 2f 2a 20 28 32 29 20 52 65    }..  /* (2) Re
7f60: 61 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ad the number of
7f70: 20 70 61 67 65 73 20 73 74 6f 72 65 64 20 69 6e   pages stored in
7f80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 2a   the journal.  *
7f90: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  /.  rc = read32b
7fa0: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
7fb0: 2c 20 28 75 33 32 2a 29 26 6e 52 65 63 29 3b 0a  , (u32*)&nRec);.
7fc0: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
7fd0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
7fe0: 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
7ff0: 66 66 66 66 20 7c 7c 20 75 73 65 4a 6f 75 72 6e  ffff || useJourn
8000: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 6e 52  alSize ){.    nR
8010: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
8020: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
8030: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
8040: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
8050: 20 20 2f 2a 20 28 33 29 20 52 65 61 64 20 74 68    /* (3) Read th
8060: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
8070: 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63  for the sanity c
8080: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 72 63 20  hecksum */.  rc 
8090: 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50  = read32bits(&pP
80a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
80b0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
80c0: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
80d0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 0a 20  end_playback;.. 
80e0: 20 2f 2a 20 28 34 29 20 52 65 61 64 20 74 68 65   /* (4) Read the
80f0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
8100: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
8110: 20 66 69 6c 65 20 70 72 69 6f 72 20 74 6f 20 74   file prior to t
8120: 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66  he.  ** start of
8130: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
8140: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
8150: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
8160: 66 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69 66  fd, &mxPg);.  if
8170: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8180: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
8190: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
81a0: 20 2f 2a 20 28 35 29 20 61 6e 64 20 28 36 29 3a   /* (5) and (6):
81b0: 20 43 68 65 63 6b 20 69 66 20 61 20 6d 61 73 74   Check if a mast
81c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
81d0: 69 73 20 73 70 65 63 69 66 69 65 64 2e 20 49 66  is specified. If
81e0: 20 6f 6e 65 20 69 73 0a 20 20 2a 2a 20 73 70 65   one is.  ** spe
81f0: 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 70 72 6f  cified, only pro
8200: 63 65 65 64 20 77 69 74 68 20 74 68 65 20 70 6c  ceed with the pl
8210: 61 79 62 61 63 6b 20 69 66 20 69 74 20 73 74 69  ayback if it sti
8220: 6c 6c 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  ll exists. */.  
8230: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
8240: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6e  &pPager->jfd, &n
8250: 4d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72  Master);.  if( r
8260: 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61  c ) goto end_pla
8270: 79 62 61 63 6b 3b 0a 20 20 69 66 28 20 6e 4d 61  yback;.  if( nMa
8280: 73 74 65 72 3e 30 20 29 7b 0a 20 20 20 20 7a 4d  ster>0 ){.    zM
8290: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 4d 61  aster = sqliteMa
82a0: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 29 3b 0a 20  lloc(nMaster);. 
82b0: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
82c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
82d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
82e0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
82f0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ack;.    }.    r
8300: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
8310: 64 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  d(&pPager->jfd, 
8320: 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
8330: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8340: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61  QLITE_OK || (zMa
8350: 73 74 65 72 5b 30 5d 20 26 26 20 21 73 71 6c 69  ster[0] && !sqli
8360: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
8370: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
8380: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
8390: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  back;.    }.  }.
83a0: 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
83b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
83c0: 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72   back to it's or
83d0: 69 67 69 6e 61 6c 20 73 69 7a 65 20 2a 2f 0a 20  iginal size */. 
83e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
83f0: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c  >origDbSize==0 |
8400: 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  | pPager->origDb
8410: 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20  Size==mxPg );.  
8420: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
8430: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
8440: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
8450: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67  SIZE*(off_t)mxPg
8460: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8470: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
8480: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
8490: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
84a0: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
84b0: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
84c0: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
84d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
84e0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
84f0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
8500: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
8510: 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
8520: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
8530: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
8540: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ger, &pPager->jf
8550: 64 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  d, 1);.    if( r
8560: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8570: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
8580: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
8590: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
85a0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
85b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
85c0: 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20    }..  /* Pages 
85d0: 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77  that have been w
85e0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
85f0: 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20  urnal but never 
8600: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72  synced.  ** wher
8610: 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62  e not restored b
8620: 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65  y the loop above
8630: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65  .  We have to re
8640: 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a  store those.  **
8650: 20 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e   pages by readin
8660: 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d  g them back from
8670: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
8680: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
8690: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
86a0: 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
86b0: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
86c0: 72 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61  r);.  }..end_pla
86d0: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 7a 4d 61  yback:.  if( zMa
86e0: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
86f0: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
8700: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
8710: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
8720: 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a  ll return true,.
8730: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
8740: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
8750: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
8760: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 65 72  r journal. If er
8770: 72 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f 63 63  rors .    ** occ
8780: 75 72 20 64 75 72 69 6e 67 20 74 68 69 73 20 70  ur during this p
8790: 72 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65 20 74  rocess, ignore t
87a0: 68 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  hem..    */.    
87b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
87c0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
87d0: 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74  _delmaster(zMast
87e0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
87f0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
8800: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
8810: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8820: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 57 65     /* FIX ME: We
8830: 20 73 68 6f 75 6c 64 6e 27 74 20 64 65 6c 65 74   shouldn't delet
8840: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  e the journal if
8850: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
8860: 64 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20  d during.    ** 
8870: 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 20 6d 61 79  rollback. It may
8880: 20 68 61 76 65 20 62 65 65 6e 20 61 20 74 72 61   have been a tra
8890: 6e 73 69 65 6e 74 20 65 72 72 6f 72 20 61 6e 64  nsient error and
88a0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   the rollback ma
88b0: 79 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64  y.    ** succeed
88c0: 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
88d0: 20 61 74 74 65 6d 70 74 65 64 2e 0a 20 20 20 20   attempted..    
88e0: 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77  */.    pager_unw
88f0: 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
8900: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
8910: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
8920: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  RR_CORRUPT;.    
8930: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
8940: 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UPT;.  }else{.  
8950: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
8960: 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
8970: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8980: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
8990: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
89a0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
89b0: 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
89c0: 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
89d0: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
89e0: 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
89f0: 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
8a00: 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
8a10: 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
8a20: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
8a30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8a40: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
8a50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
8a60: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f  statement is sto
8a70: 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73  red in pPager->s
8a80: 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  tmtSize, not in 
8a90: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
8aa0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
8ab0: 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
8ac0: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
8ad0: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
8ae0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
8af0: 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
8b00: 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
8b10: 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
8b20: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
8b30: 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
8b40: 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
8b50: 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  t pPager->stmtJS
8b60: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
8b70: 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c  nt pager_stmt_pl
8b80: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
8b90: 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73  ager){.  off_t s
8ba0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
8bb0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
8bc0: 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
8bd0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8bf0: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
8c00: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c20: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
8c30: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  /.  int rc;..  /
8c40: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
8c50: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
8c60: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
8c70: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
8c80: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
8c90: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  (&pPager->fd, SQ
8ca0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28  LITE_PAGE_SIZE*(
8cb0: 6f 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 73 74  off_t)pPager->st
8cc0: 6d 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  mtSize);.  pPage
8cd0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
8ce0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20  er->stmtSize;.. 
8cf0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
8d00: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
8d10: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
8d20: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
8d30: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
8d40: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
8d50: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
8d60: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
8d70: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
8d80: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
8d90: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
8da0: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
8db0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
8dc0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
8dd0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
8de0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
8df0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
8e00: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
8e10: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
8e20: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
8e30: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
8e40: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
8e50: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
8e60: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
8e70: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
8e80: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
8e90: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
8ea0: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
8eb0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
8ec0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
8ed0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
8ee0: 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20   &pPager->stfd, 
8ef0: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
8f00: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
8f10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8f20: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
8f30: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
8f40: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  k;.  }..  /* Fig
8f50: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
8f60: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
8f70: 65 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  e copied out of 
8f80: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
8f90: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20    ** journal..  
8fa0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
8fb0: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
8fc0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74  >jfd, pPager->st
8fd0: 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
8fe0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8ff0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74  .    goto end_st
9000: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
9010: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
9020: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
9030: 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
9040: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9050: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
9060: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
9070: 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28  ;.  }.  nRec = (
9080: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 73 74  szJ - pPager->st
9090: 6d 74 4a 53 69 7a 65 29 2f 4a 4f 55 52 4e 41 4c  mtJSize)/JOURNAL
90a0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
90b0: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
90c0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
90d0: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
90e0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
90f0: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ger, &pPager->jf
9100: 64 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  d, 1);.    if( r
9110: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9120: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
9130: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
9140: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
9150: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
9160: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f     }.  }.  .end_
9170: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
9180: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9190: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
91a0: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
91b0: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
91c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
91d0: 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72  CORRUPT;.  }.  r
91e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
91f0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
9200: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
9210: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
9220: 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
9230: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
9240: 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68  mum number is th
9250: 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  e absolute value
9260: 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20 70   of the mxPage p
9270: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20  arameter..** If 
9280: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
9290: 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66  ve, the noSync f
92a0: 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e  lag is also set.
92b0: 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65    noSync bypasse
92c0: 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  s.** calls to sq
92d0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 2e 20 20  lite3OsSync().  
92e0: 54 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d  The pager runs m
92f0: 75 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20  uch faster with 
9300: 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75  noSync on,.** bu
9310: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
9320: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
9330: 73 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e  s or there is an
9340: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a   abrupt power .*
9350: 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  * failure, the d
9360: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67  atabase file mig
9370: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ht be left in an
9380: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
9390: 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c  d.** unrepairabl
93a0: 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f  e state.  .*/.vo
93b0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
93c0: 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61  set_cachesize(Pa
93d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
93e0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
93f0: 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  mxPage>=0 ){.   
9400: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
9410: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
9420: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  le;.    if( pPag
9430: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
9440: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
9450: 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0; .  }else{.   
9460: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
9470: 3d 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20  = 1;.    mxPage 
9480: 3d 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20  = -mxPage;.  }. 
9490: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
94a0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
94b0: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
94c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75   }.}../*.** Adju
94d0: 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
94e0: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
94f0: 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
9500: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
9510: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
9520: 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
9530: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
9540: 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
9550: 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
9560: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
9570: 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
9580: 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
9590: 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
95a0: 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
95b0: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
95c0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
95e0: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
95f0: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
9600: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
9610: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
9620: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
9630: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
9640: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
9650: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
9660: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
9670: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
9680: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
9690: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
96a0: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
96b0: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
96c0: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
96d0: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
96e0: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
96f0: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
9700: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
9710: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
9720: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
9730: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
9740: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
9750: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
9760: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9770: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
9780: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
9790: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
97a0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
97b0: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
97c0: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
97d0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
97e0: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
97f0: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
9800: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
9810: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
9830: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9840: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
9850: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
9860: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
9870: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
9880: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
9890: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
98b0: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
98c0: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
98d0: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
98e0: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
98f0: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
9900: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
9910: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
9920: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
9930: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
9940: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
9950: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
9960: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
9970: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
9980: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
9990: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
99a0: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
99b0: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
99c0: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69  d FULL=3..*/.voi
99d0: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
99e0: 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28  et_safety_level(
99f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
9a00: 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61  nt level){.  pPa
9a10: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c  ger->noSync =  l
9a20: 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65  evel==1 || pPage
9a30: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
9a40: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
9a50: 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70  = level==3 && !p
9a60: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
9a70: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
9a80: 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
9a90: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
9aa0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
9ab0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57  mporary file.  W
9ac0: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
9ad0: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a   the file into z
9ae0: 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d  Name.** (zName m
9af0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
9b00: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
9b10: 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e  SIZE bytes long.
9b20: 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  )  Write.** the 
9b30: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9b40: 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
9b50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
9b60: 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
9b70: 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
9b80: 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a  de if we fail..*
9b90: 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c  *.** The OS will
9ba0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
9bb0: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
9bc0: 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
9bd0: 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a   is.** closed..*
9be0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
9bf0: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
9c00: 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  mp(char *zFile, 
9c10: 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69  OsFile *fd){.  i
9c20: 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e  nt cnt = 8;.  in
9c30: 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  t rc;.  do{.    
9c40: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
9c50: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
9c60: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20  (zFile);.    rc 
9c70: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
9c80: 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20  xclusive(zFile, 
9c90: 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65  fd, 1);.  }while
9ca0: 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53  ( cnt>0 && rc!=S
9cb0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
9cc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9cd0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
9ce0: 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75  age cache and pu
9cf0: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
9d00: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e  he page cache in
9d10: 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68   *ppPager..** Th
9d20: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
9d30: 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69  hed need not exi
9d40: 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73  st.  The file is
9d50: 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69   not locked unti
9d60: 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  l.** the first c
9d70: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61  all to sqlite3pa
9d80: 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73  ger_get() and is
9d90: 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
9da0: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
9db0: 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
9dc0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
9dd0: 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a  pager_unref()..*
9de0: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
9df0: 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
9e00: 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
9e10: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
9e20: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
9e30: 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
9e40: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
9e50: 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
9e60: 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
9e70: 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
9e80: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  it is closed..*/
9e90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
9ea0: 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20  r_open(.  Pager 
9eb0: 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
9ec0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
9ed0: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
9ee0: 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
9ef0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
9f00: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
9f10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9f20: 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
9f30: 74 20 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20  t mxPage,       
9f40: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75         /* Max nu
9f50: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
9f60: 79 20 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f  y cache pages */
9f70: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9f90: 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
9fa0: 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
9fb0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
9fc0: 74 20 75 73 65 4a 6f 75 72 6e 61 6c 2c 20 20 20  t useJournal,   
9fd0: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74         /* TRUE t
9fe0: 6f 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  o use a rollback
9ff0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
a000: 20 66 69 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20   file */.  void 
a010: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 20 20   *pBusyHandler  
a020: 20 20 20 20 2f 2a 20 42 75 73 79 20 63 61 6c 6c      /* Busy call
a030: 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  back */.){.  Pag
a040: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68  er *pPager;.  ch
a050: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
a060: 65 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e  e;.  int nameLen
a070: 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20  ;.  OsFile fd;. 
a080: 20 69 6e 74 20 72 63 2c 20 69 3b 0a 20 20 69 6e   int rc, i;.  in
a090: 74 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 6e  t tempFile;.  in
a0a0: 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69  t memDb = 0;.  i
a0b0: 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
a0c0: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
a0d0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
a0e0: 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72  ZE];..  *ppPager
a0f0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
a100: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
a110: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
a120: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a130: 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  }.  if( zFilenam
a140: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
a150: 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ] ){.    if( str
a160: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
a170: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
a180: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
a190: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
a1a0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  name = sqliteMal
a1b0: 6c 6f 63 28 34 29 3b 0a 20 20 20 20 20 20 69 66  loc(4);.      if
a1c0: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
a1d0: 29 20 73 74 72 63 70 79 28 7a 46 75 6c 6c 50 61  ) strcpy(zFullPa
a1e0: 74 68 6e 61 6d 65 2c 20 22 22 29 3b 0a 20 20 20  thname, "");.   
a1f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
a200: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
a210: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
a220: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
a230: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
a240: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ame);.      rc =
a250: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
a260: 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74  adWrite(zFullPat
a270: 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61  hname, &fd, &rea
a280: 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 74 65  dOnly);.      te
a290: 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  mpFile = 0;.    
a2a0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
a2b0: 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
a2c0: 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
a2d0: 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65   &fd);.    zFile
a2e0: 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  name = zTemp;.  
a2f0: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
a300: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
a310: 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  athname(zFilenam
a320: 65 29 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  e);.    tempFile
a330: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
a340: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
a350: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
a360: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a370: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
a380: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a390: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
a3a0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
a3b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
a3c0: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61  NTOPEN;.  }.  na
a3d0: 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  meLen = strlen(z
a3e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
a3f0: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
a400: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
a410: 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65  pPager) + nameLe
a420: 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 69 66  n*3 + 30 );.  if
a430: 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20  ( pPager==0 ){. 
a440: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
a450: 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  e(&fd);.    sqli
a460: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
a470: 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
a480: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
a490: 20 20 7d 0a 20 20 53 45 54 5f 50 41 47 45 52 28    }.  SET_PAGER(
a4a0: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
a4b0: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  r->zFilename = (
a4c0: 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d  char*)&pPager[1]
a4d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
a4e0: 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
a4f0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65  ->zFilename[name
a500: 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72  Len+1];.  pPager
a510: 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50  ->zJournal = &pP
a520: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
a530: 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73  [nameLen+1];.  s
a540: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  trcpy(pPager->zF
a550: 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  ilename, zFullPa
a560: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  thname);.  strcp
a570: 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  y(pPager->zDirec
a580: 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  tory, zFullPathn
a590: 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61  ame);.  for(i=na
a5a0: 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50  meLen; i>0 && pP
a5b0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
a5c0: 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  [i-1]!='/'; i--)
a5d0: 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70  {}.  if( i>0 ) p
a5e0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
a5f0: 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74  y[i-1] = 0;.  st
a600: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rcpy(pPager->zJo
a610: 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68  urnal, zFullPath
a620: 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  name);.  sqliteF
a630: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
a640: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50  e);.  strcpy(&pP
a650: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
a660: 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e  ameLen], "-journ
a670: 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  al");.  pPager->
a680: 66 64 20 3d 20 66 64 3b 0a 20 20 70 50 61 67 65  fd = fd;.  pPage
a690: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
a6a0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   0;.  pPager->us
a6b0: 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
a6c0: 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
a6d0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  .  pPager->stmtO
a6e0: 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  pen = 0;.  pPage
a6f0: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
a700: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
a710: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a720: 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31  dbSize = memDb-1
a730: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ;.  pPager->page
a740: 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 50 41  Size = SQLITE_PA
a750: 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65  GE_SIZE;.  pPage
a760: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
a770: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
a780: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
a790: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
a7a0: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
a7b0: 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50  = mxPage>5 ? mxP
a7c0: 61 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67  age : 10;.  pPag
a7d0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
a7e0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  R_UNLOCK;.  pPag
a7f0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
a800: 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
a810: 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
a820: 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
a830: 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  = memDb;.  pPage
a840: 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65  r->readOnly = re
a850: 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72  adOnly;.  pPager
a860: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
a870: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
a880: 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
a890: 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
a8a0: 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46  al;.  pPager->pF
a8b0: 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  irst = 0;.  pPag
a8c0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
a8d0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a8e0: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
a8f0: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45  ger->nExtra = nE
a900: 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
a910: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 28  pBusyHandler = (
a920: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 29 70 42  BusyHandler *)pB
a930: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 6d 65  usyHandler;.  me
a940: 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
a950: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
a960: 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20  ager->aHash));. 
a970: 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
a980: 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
a990: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
a9a0: 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63   Set the destruc
a9b0: 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  tor for this pag
a9c0: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
a9d0: 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  , the destructor
a9e0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68   is called.** wh
a9f0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
aa00: 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70   count on each p
aa10: 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f  age reaches zero
aa20: 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  .  The destructo
aa30: 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  r can.** be used
aa40: 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66   to clean up inf
aa50: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
aa60: 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70  extra segment ap
aa70: 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70  pended to each p
aa80: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  age..**.** The d
aa90: 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74  estructor is not
aaa0: 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73   called as a res
aab0: 75 6c 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  ult sqlite3pager
aac0: 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44  _close().  .** D
aad0: 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f  estructors are o
aae0: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
aaf0: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
ab00: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
ab10: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73  te3pager_set_des
ab20: 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70  tructor(Pager *p
ab30: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44  Pager, void (*xD
ab40: 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  esc)(void*,int))
ab50: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
ab60: 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
ab70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ab80: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
ab90: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
aba0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
abb0: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
abc0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
abd0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
abe0: 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
abf0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
ac00: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
ac10: 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
ac20: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
ac30: 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
ac40: 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
ac50: 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
ac60: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
ac70: 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
ac80: 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
ac90: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
aca0: 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
acb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
acc0: 67 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72  ger_set_reiniter
acd0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ace0: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
acf0: 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  void*,int)){.  p
ad00: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
ad10: 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
ad20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
ad30: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
ad40: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
ad50: 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
ad60: 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
ad70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ad80: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
ad90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ada0: 20 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73    off_t n;.  ass
adb0: 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
adc0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
add0: 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20  dbSize>=0 ){.   
ade0: 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
adf0: 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  dbSize;.  }.  if
ae00: 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  ( sqlite3OsFileS
ae10: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ize(&pPager->fd,
ae20: 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   &n)!=SQLITE_OK 
ae30: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
ae40: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
ae50: 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65  ERR_DISK;.    re
ae60: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20  turn 0;.  }.  n 
ae70: 2f 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  /= SQLITE_PAGE_S
ae80: 49 5a 45 3b 0a 20 20 69 66 28 20 70 50 61 67 65  IZE;.  if( pPage
ae90: 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
aea0: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50  UNLOCK ){.    pP
aeb0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
aec0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
aed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
aee0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
aef0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
af00: 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 2c  cJournal(Pager*,
af10: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a   const char*);..
af20: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
af30: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
af40: 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
af50: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
af60: 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
af70: 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
af80: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
af90: 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
afa0: 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
afb0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
afc0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
afd0: 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
afe0: 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
aff0: 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
b000: 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
b010: 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
b020: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
b030: 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
b040: 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
b050: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
b060: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
b070: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
b080: 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
b090: 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
b0a0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
b0b0: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
b0c0: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
b0d0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
b0e0: 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
b0f0: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
b100: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
b110: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
b120: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
b130: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
b140: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
b150: 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
b160: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
b170: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
b180: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
b190: 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
b1a0: 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
b1b0: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
b1c0: 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
b1d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
b1e0: 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
b1f0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
b200: 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
b210: 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
b220: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
b230: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
b240: 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
b250: 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
b260: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
b270: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
b280: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
b290: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
b2a0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
b2b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
b2c0: 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
b2d0: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
b2e0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
b2f0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
b300: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
b310: 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50   = pager_hash(pP
b320: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
b330: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
b340: 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20  ash[h]==pPg );. 
b350: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
b360: 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
b370: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Hash;.  }.  pPg-
b380: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
b390: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
b3a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
b3b0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
b3c0: 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e  o truncate an in
b3d0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
b3e0: 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 65 76 65  .  Delete.** eve
b3f0: 72 79 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ry pages whose p
b400: 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68  gno is larger th
b410: 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
b420: 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
b430: 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65  enced..** Refere
b440: 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
b450: 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
b460: 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
b470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b480: 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
b490: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b4a0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
b4b0: 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20  PgHdr **ppPg;.  
b4c0: 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61  int dbSize = pPa
b4d0: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
b4e0: 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e  ppPg = &pPager->
b4f0: 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  pAll;.  while( (
b500: 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20  pPg = *ppPg)!=0 
b510: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
b520: 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a  pgno<=dbSize ){.
b530: 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
b540: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
b550: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e   }else if( pPg->
b560: 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRef>0 ){.      
b570: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
b580: 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
b590: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
b5a0: 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
b5b0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
b5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
b5d0: 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78  ppPg = pPg->pNex
b5e0: 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69  tAll;.      unli
b5f0: 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
b600: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
b610: 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
b620: 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
b630: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
b640: 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
b650: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
b660: 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
b670: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b680: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
b690: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
b6a0: 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
b6b0: 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
b6c0: 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 7b 0a 20  r->dbSize<0 ){. 
b6d0: 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
b6e0: 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
b6f0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
b700: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
b710: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
b720: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
b730: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
b740: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
b750: 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61  e>=(unsigned)pPa
b760: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
b770: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b780: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
b790: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
b7a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
b7b0: 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
b7c0: 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
b7d0: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
b7e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
b7f0: 7d 0a 20 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  }.  syncJournal(
b800: 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 63  pPager, 0);.  rc
b810: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
b820: 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  cate(&pPager->fd
b830: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
b840: 5a 45 2a 28 6f 66 66 5f 74 29 6e 50 61 67 65 29  ZE*(off_t)nPage)
b850: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
b860: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
b870: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
b880: 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  age;.  }.  retur
b890: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
b8a0: 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
b8b0: 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
b8c0: 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
b8d0: 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
b8e0: 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
b8f0: 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
b900: 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
b910: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
b920: 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
b930: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
b940: 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
b950: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
b960: 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
b970: 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
b980: 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
b990: 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
b9a0: 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
b9b0: 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
b9c0: 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
b9d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
b9e0: 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
b9f0: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
ba00: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74  coredump..*/.int
ba10: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
ba20: 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
ba30: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
ba40: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74  , *pNext;.  swit
ba50: 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ch( pPager->stat
ba60: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41  e ){.    case PA
ba70: 47 45 52 5f 52 45 53 45 52 56 45 44 3a 0a 20 20  GER_RESERVED:.  
ba80: 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 59 4e    case PAGER_SYN
ba90: 43 45 44 3a 20 0a 20 20 20 20 63 61 73 65 20 50  CED: .    case P
baa0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3a 20  AGER_EXCLUSIVE: 
bab0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70  {.      sqlite3p
bac0: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
bad0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
bae0: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
baf0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
bb00: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
bb10: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
bb20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bb30: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
bb40: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
bb50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bb60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 41     }.    case PA
bb70: 47 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20  GER_SHARED: {.  
bb80: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
bb90: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
bba0: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
bbb0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
bbc0: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
bbd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bbe0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
bbf0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
bc00: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
bc10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
bc20: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
bc30: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
bc40: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  g=pNext){.    pN
bc50: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
bc60: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
bc70: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
bc80: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
bc90: 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Db ){.    sqlite
bca0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
bcb0: 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ->fd);.  }.  ass
bcc0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
bcd0: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
bce0: 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61   /* Temp files a
bcf0: 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
bd00: 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
bd10: 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67  OS.  ** if( pPag
bd20: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
bd30: 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73    **   sqlite3Os
bd40: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
bd50: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20  Filename);.  ** 
bd60: 7d 0a 20 20 2a 2f 0a 20 20 43 4c 52 5f 50 41 47  }.  */.  CLR_PAG
bd70: 45 52 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ER(pPager);.  if
bd80: 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  ( pPager->zFilen
bd90: 61 6d 65 21 3d 28 63 68 61 72 2a 29 26 70 50 61  ame!=(char*)&pPa
bda0: 67 65 72 5b 31 5d 20 29 7b 0a 20 20 20 20 61 73  ger[1] ){.    as
bdb0: 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43  sert( 0 );  /* C
bdc0: 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a  annot happen */.
bdd0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
bde0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
bdf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
be00: 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
be10: 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  al);.    sqliteF
be20: 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  ree(pPager->zDir
be30: 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 20 20 73  ectory);.  }.  s
be40: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
be50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
be60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
be70: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
be80: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
be90: 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
bea0: 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70  */.Pgno sqlite3p
beb0: 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
bec0: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
bed0: 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f  PgHdr *p = DATA_
bee0: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
bef0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
bf00: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
bf10: 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
bf20: 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
bf30: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
bf40: 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
bf50: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
bf60: 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
bf70: 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
bf80: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
bf90: 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
bfa0: 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
bfb0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
bfc0: 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
bfd0: 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
bfe0: 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
bff0: 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
c000: 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
c010: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
c020: 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
c030: 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
c040: 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
c050: 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
c060: 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
c070: 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
c080: 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
c090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c0a0: 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
c0b0: 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
c0c0: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
c0d0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
c0e0: 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
c0f0: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
c100: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
c110: 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
c120: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
c130: 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
c140: 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
c150: 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
c160: 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
c170: 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
c180: 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
c190: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
c1a0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
c1b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
c1c0: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
c1d0: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
c1e0: 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
c1f0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
c200: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c210: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
c220: 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
c230: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
c240: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
c250: 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
c260: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
c270: 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
c280: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
c290: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
c2a0: 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
c2b0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
c2c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
c2d0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
c2e0: 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
c2f0: 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
c300: 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
c310: 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63  TE_TEST.  static
c320: 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50   void page_ref(P
c330: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20  gHdr *pPg){.    
c340: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
c350: 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f   ){.      _page_
c360: 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ref(pPg);.    }e
c370: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
c380: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45  nRef++;.      RE
c390: 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20  FINFO(pPg);.    
c3a0: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  }.  }.#else.# de
c3b0: 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29  fine page_ref(P)
c3c0: 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30     ((P)->nRef==0
c3d0: 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76  ?_page_ref(P):(v
c3e0: 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29  oid)(P)->nRef++)
c3f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
c400: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
c410: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
c420: 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e   a page.  The in
c430: 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a  put pointer is.*
c440: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  * a reference to
c450: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
c460: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
c470: 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44  ger_ref(void *pD
c480: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
c490: 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
c4a0: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67  DR(pData);.  pag
c4b0: 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
c4c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c4d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
c4e0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f  e journal.  In o
c4f0: 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
c500: 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
c510: 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
c520: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
c530: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
c540: 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
c550: 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
c560: 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20  f the.** disk.  
c570: 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
c580: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69  o modify the ori
c590: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
c5a0: 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a  ile until after.
c5b0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
c5c0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20  as been synced. 
c5d0: 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
c5e0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64   database is mod
c5f0: 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ified before.** 
c600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
c610: 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65  ynced and a powe
c620: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
c630: 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a  , the unsynced j
c640: 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77  ournal.** data w
c650: 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64  ould be lost and
c660: 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61   we would be una
c670: 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ble to completel
c680: 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a  y rollback the.*
c690: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
c6a0: 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  es.  Database co
c6b0: 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f  rruption would o
c6c0: 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  ccur..** .** Thi
c6d0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75  s routine also u
c6e0: 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20  pdates the nRec 
c6f0: 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61  field in the hea
c700: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
c710: 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d  al..** (See comm
c720: 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ents on the page
c730: 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
c740: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
c750: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
c760: 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63  ).** If the sync
c770: 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74   mode is FULL, t
c780: 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63  wo syncs will oc
c790: 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20  cur.  First the 
c7a0: 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  whole journal.**
c7b0: 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e   is synced, then
c7c0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
c7d0: 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e  is updated, then
c7e0: 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f   a second sync o
c7f0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ccurs..**.** For
c800: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
c810: 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20  ases, we do not 
c820: 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61  care if we are a
c830: 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  ble to rollback.
c840: 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72  ** after a power
c850: 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e   failure, so syn
c860: 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
c870: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  This routine cle
c880: 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ars the needSync
c890: 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20   field of every 
c8a0: 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c  page current hel
c8b0: 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a  d in.** memory..
c8c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
c8d0: 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
c8e0: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
c8f0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
c900: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
c910: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c920: 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
c930: 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
c940: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
c950: 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
c960: 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
c970: 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
c980: 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
c990: 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
c9a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
c9b0: 65 64 53 79 6e 63 20 7c 7c 20 7a 4d 61 73 74 65  edSync || zMaste
c9c0: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  r ){.    if( !pP
c9d0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c9e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c9f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ca00: 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  pen );.      /* 
ca10: 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
ca20: 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f  >noSync ); // no
ca30: 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65  Sync might be se
ca40: 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  t if synchronous
ca50: 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75  .      ** was tu
ca60: 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74  rned off after t
ca70: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
ca80: 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63  as started.  Tic
ca90: 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e  ket #615 */.#ifn
caa0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20  def NDEBUG.     
cab0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   {.        /* Ma
cac0: 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67  ke sure the pPag
cad0: 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72  er->nRec counter
cae0: 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20   we are keeping 
caf0: 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a  agrees.        *
cb00: 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20  * with the nRec 
cb10: 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
cb20: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
cb30: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
cb40: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f      */.        o
cb50: 66 66 5f 74 20 68 64 72 53 7a 2c 20 70 67 53 7a  ff_t hdrSz, pgSz
cb60: 2c 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 68  , jSz;.        h
cb70: 64 72 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  drSz = JOURNAL_H
cb80: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
cb90: 20 20 20 20 20 20 20 70 67 53 7a 20 3d 20 4a 4f         pgSz = JO
cba0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
cbb0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
cbc0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
cbd0: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
cbe0: 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20  , &jSz);.       
cbf0: 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
cc00: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
cc10: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
cc20: 6e 52 65 63 2a 70 67 53 7a 2b 68 64 72 53 7a 3d  nRec*pgSz+hdrSz=
cc30: 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a  =jSz );.      }.
cc40: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
cc50: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
cc60: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
cc70: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
cc80: 66 69 6c 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  file header */. 
cc90: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 73 7a 4a         off_t szJ
cca0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
ccb0: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
ccc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  {.          TRAC
ccd0: 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
cce0: 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
ccf0: 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20 20  r->fd.h);.      
cd00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cd10: 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e  OsSync(&pPager->
cd20: 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
cd30: 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
cd40: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
cd50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cd60: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
cd70: 6a 66 64 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  jfd, sizeof(aJou
cd80: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
cd90: 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
cda0: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
cdb0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  fd, pPager->nRec
cdc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
cdd0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
cde0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
cdf0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
ce00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce10: 66 69 6c 65 20 69 66 20 6f 6e 65 20 69 73 20 73  file if one is s
ce20: 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  pecified */.    
ce30: 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20      if( zMaster 
ce40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
ce50: 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 4d 61 73  ert( strlen(zMas
ce60: 74 65 72 29 3c 70 50 61 67 65 72 2d 3e 6e 4d 61  ter)<pPager->nMa
ce70: 73 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  ster );.        
ce80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ce90: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
cea0: 64 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20  d, 20);.        
ceb0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cec0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
ced0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
cee0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
cef0: 2c 20 7a 4d 61 73 74 65 72 2c 20 73 74 72 6c 65  , zMaster, strle
cf00: 6e 28 7a 4d 61 73 74 65 72 29 2b 31 29 3b 0a 20  n(zMaster)+1);. 
cf10: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
cf20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
cf30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
cf40: 73 7a 4a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ = JOURNAL_HD
cf50: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 20  R_SZ(pPager) +  
cf60: 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55  pPager->nRec*JOU
cf70: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
cf80: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
cf90: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
cfa0: 72 2d 3e 6a 66 64 2c 20 73 7a 4a 29 3b 0a 20 20  r->jfd, szJ);.  
cfb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
cfc0: 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
cfd0: 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
cfe0: 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20 20  r->fd.h);.      
cff0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
d000: 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
d010: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d020: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
d030: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
d040: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
d050: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
d060: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
d070: 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
d080: 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
d090: 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
d0a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
d0b0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
d0c0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
d0d0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
d0e0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
d0f0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
d100: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
d110: 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
d120: 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
d130: 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
d140: 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
d150: 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
d160: 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
d170: 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
d180: 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
d190: 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
d1a0: 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
d1b0: 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
d1c0: 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
d1d0: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
d1e0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
d1f0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
d200: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
d210: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d220: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
d230: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
d240: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
d250: 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
d260: 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
d270: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
d280: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
d290: 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
d2a0: 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
d2b0: 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
d2c0: 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
d2d0: 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
d2e0: 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
d2f0: 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
d300: 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
d310: 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
d320: 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
d330: 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
d340: 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
d350: 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
d360: 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
d370: 72 63 3b 0a 20 20 69 6e 74 20 62 75 73 79 20 3d  rc;.  int busy =
d380: 20 31 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74   1;..  if( pList
d390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
d3a0: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
d3b0: 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
d3c0: 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
d3d0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
d3e0: 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
d3f0: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
d400: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
d410: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
d420: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
d430: 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
d440: 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
d450: 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
d460: 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
d470: 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
d480: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
d490: 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
d4a0: 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
d4b0: 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
d4c0: 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
d4d0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
d4e0: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
d4f0: 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
d500: 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
d510: 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
d520: 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
d530: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
d540: 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
d550: 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
d560: 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
d570: 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
d580: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
d590: 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
d5a0: 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
d5b0: 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
d5c0: 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
d5d0: 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
d5e0: 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
d5f0: 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
d600: 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
d610: 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
d620: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
d630: 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
d640: 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
d650: 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
d660: 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
d670: 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
d680: 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
d690: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
d6a0: 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
d6b0: 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
d6c0: 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
d6d0: 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
d6e0: 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
d6f0: 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
d700: 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
d710: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
d720: 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
d730: 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20  .  */.  do {.   
d740: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
d750: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
d760: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
d770: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
d780: 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 0a  SQLITE_BUSY && .
d790: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
d7a0: 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a 20  usyHandler && . 
d7b0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
d7c0: 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63  syHandler->xFunc
d7d0: 20 26 26 20 0a 20 20 20 20 20 20 70 50 61 67 65   && .      pPage
d7e0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
d7f0: 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70  >xFunc(pPager->p
d800: 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72  BusyHandler->pAr
d810: 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20 29 3b 0a  g, busy++).  );.
d820: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d830: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
d840: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
d850: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
d860: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20  R_EXCLUSIVE;..  
d870: 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
d880: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d890: 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
d8a0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
d8b0: 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73  Pager->fd, (pLis
d8c0: 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f  t->pgno-1)*(off_
d8d0: 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  t)SQLITE_PAGE_SI
d8e0: 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70  ZE);.    CODEC(p
d8f0: 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
d900: 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
d910: 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20  st->pgno, 6);.  
d920: 20 20 54 52 41 43 45 32 28 22 53 54 4f 52 45 20    TRACE2("STORE 
d930: 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 4c 69 73  page %d\n", pLis
d940: 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 72 63  t->pgno);.    rc
d950: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
d960: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  e(&pPager->fd, P
d970: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
d980: 73 74 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  st), SQLITE_PAGE
d990: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45  _SIZE);.    CODE
d9a0: 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
d9b0: 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
d9c0: 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b  pList->pgno, 0);
d9d0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
d9e0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69  turn rc;.    pLi
d9f0: 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  st->dirty = 0;. 
da00: 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
da10: 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20  ->pDirty;.  }.  
da20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
da30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65  ;.}../*.** Colle
da40: 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70  ct every dirty p
da50: 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79  age into a dirty
da60: 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74   list and.** ret
da70: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
da80: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61   the head of tha
da90: 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67  t list.  All pag
daa0: 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63  es are.** collec
dab0: 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79  ted even if they
dac0: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73   are still in us
dad0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  e..*/.static PgH
dae0: 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c  dr *pager_get_al
daf0: 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61  l_dirty_pages(Pa
db00: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
db10: 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74  PgHdr *p, *pList
db20: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20  ;.  pList = 0;. 
db30: 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
db40: 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
db50: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
db60: 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  p->dirty ){.    
db70: 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c    p->pDirty = pL
db80: 69 73 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  ist;.      pList
db90: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = p;.    }.  }.
dba0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
dbb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
dbc0: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
dbd0: 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
dbe0: 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
dbf0: 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
dc00: 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
dc10: 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
dc20: 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
dc30: 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
dc40: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
dc50: 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f  eased..**.** A _
dc60: 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  get works for an
dc70: 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
dc80: 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
dc90: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
dca0: 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
dcb0: 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
dcc0: 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
dcd0: 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
dce0: 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
dcf0: 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
dd00: 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
dd10: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
dd20: 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
dd30: 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
dd40: 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
dd50: 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
dd60: 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
dd70: 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
dd80: 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
dd90: 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
dda0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
ddb0: 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
ddc0: 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
ddd0: 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
dde0: 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
ddf0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
de00: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
de10: 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
de20: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
de30: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
de40: 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e  3pager_lookup().
de50: 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
de60: 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28  ine and _lookup(
de70: 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
de80: 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
de90: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
dea0: 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
deb0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
dec0: 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
ded0: 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
dee0: 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
def0: 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
df00: 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a  eas _lookup().**
df10: 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
df20: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
df30: 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
df40: 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
df50: 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
df60: 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
df70: 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
df80: 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
df90: 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
dfa0: 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75  .** Since _looku
dfb0: 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
dfc0: 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
dfd0: 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
dfe0: 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
dff0: 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
e000: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
e010: 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  _get(Pager *pPag
e020: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76  er, Pgno pgno, v
e030: 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20  oid **ppPage){. 
e040: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
e050: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  nt rc;..  /* Mak
e060: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
e070: 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
e080: 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
e090: 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67   .  assert( pPag
e0a0: 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
e0b0: 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
e0c0: 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  *ppPage = 0;.  i
e0d0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
e0e0: 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52  sk & ~(PAGER_ERR
e0f0: 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65  _FULL) ){.    re
e100: 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
e110: 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
e120: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
e130: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
e140: 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67  accessed, then g
e150: 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  et a SHARED lock
e160: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
e170: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
e180: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
e190: 52 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65  Ref==0 && !pPage
e1a0: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
e1b0: 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20  int busy = 1;.  
e1c0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
e1d0: 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
e1e0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  &pPager->fd, SHA
e1f0: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  RED_LOCK);.    }
e200: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
e210: 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20 20 20  E_BUSY && .     
e220: 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
e230: 48 61 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20  Handler && .    
e240: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
e250: 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20  yHandler->xFunc 
e260: 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
e270: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
e280: 2d 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e  ->xFunc(pPager->
e290: 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41  pBusyHandler->pA
e2a0: 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20  rg, busy++).    
e2b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
e2c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e2d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
e2e0: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
e2f0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
e300: 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  RED;..    /* If 
e310: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
e320: 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
e330: 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
e340: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
e350: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
e360: 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
e370: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
e380: 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
e390: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
e3a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  if( pPager->useJ
e3b0: 6f 75 72 6e 61 6c 20 26 26 20 0a 20 20 20 20 20  ournal && .     
e3c0: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
e3d0: 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a  Exists(pPager->z
e3e0: 4a 6f 75 72 6e 61 6c 29 20 26 26 0a 20 20 20 20  Journal) &&.    
e3f0: 20 20 20 20 21 73 71 6c 69 74 65 33 4f 73 43 68      !sqlite3OsCh
e400: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
e410: 26 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20  &pPager->fd) .  
e420: 20 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20    ){.       int 
e430: 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47  rc;..       /* G
e440: 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
e450: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
e460: 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
e470: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e480: 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  3OsLock(&pPager-
e490: 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
e4a0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28  OCK);.       if(
e4b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e4c0: 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  {.         sqlit
e4d0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
e4e0: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
e4f0: 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
e500: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
e510: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
e520: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
e530: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
e540: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
e550: 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20  ER_EXCLUSIVE;.. 
e560: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
e570: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
e580: 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74  ading only.  Ret
e590: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
e5a0: 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20  if.       ** we 
e5b0: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70  are unable to op
e5c0: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
e5d0: 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a  ile. .       **.
e5e0: 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f         ** The jo
e5f0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
e600: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
e610: 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54  ocked itself.  T
e620: 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he.       ** jou
e630: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
e640: 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
e650: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e660: 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
e670: 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f     ** a write lo
e680: 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ck, so there is 
e690: 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65  never any chance
e6a0: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
e6b0: 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
e6c0: 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
e6d0: 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
e6e0: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
e6f0: 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
e700: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
e710: 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a  dOnly(pPager->zJ
e720: 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
e730: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66  >jfd);.       if
e740: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e750: 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
e760: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
e770: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
e780: 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  );.         pPag
e790: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
e7a0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
e7b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e7c0: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a  _BUSY;.       }.
e7d0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
e7e0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
e7f0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
e800: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
e810: 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c  0;..       /* Pl
e820: 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
e830: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
e840: 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
e850: 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a  e write.       *
e860: 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
e870: 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
e880: 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ck..       */.  
e890: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
e8a0: 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
e8b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20   0);.       if( 
e8c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e8d0: 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
e8e0: 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20   rc;.       }.  
e8f0: 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b    }.    pPg = 0;
e900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e910: 20 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65   Search for page
e920: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20   in cache */.   
e930: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
e940: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
e950: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
e960: 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67  r->memDb && pPag
e970: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
e980: 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
e990: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
e9a0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
e9b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
e9c0: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
e9d0: 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
e9e0: 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
e9f0: 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
ea00: 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70      int h;.    p
ea10: 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a  Pager->nMiss++;.
ea20: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
ea30: 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
ea40: 50 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Page || pPager->
ea50: 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 70 50 61  pFirst==0 || pPa
ea60: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
ea70: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
ea80: 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  new page */.    
ea90: 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61    pPg = sqliteMa
eaa0: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
eab0: 2a 70 50 67 29 20 2b 20 53 51 4c 49 54 45 5f 50  *pPg) + SQLITE_P
eac0: 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 20  AGE_SIZE .      
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eae0: 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
eaf0: 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
eb00: 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb20: 20 20 20 20 20 2b 20 70 50 61 67 65 72 2d 3e 6d       + pPager->m
eb30: 65 6d 44 62 2a 73 69 7a 65 6f 66 28 50 67 48 69  emDb*sizeof(PgHi
eb40: 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20  story) );.      
eb50: 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
eb60: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72        pager_unwr
eb70: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
eb80: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
eb90: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
eba0: 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20  R_ERR_MEM;.     
ebb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ebc0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
ebd0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
ebe0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67  , 0, sizeof(*pPg
ebf0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
ec00: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
ec10: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
ec20: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
ec30: 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a   pPager), 0, siz
ec40: 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b  eof(PgHistory));
ec50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ec60: 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
ec70: 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ger;.      pPg->
ec80: 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65  pNextAll = pPage
ec90: 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70  r->pAll;.      p
eca0: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
ecb0: 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  g;.      pPager-
ecc0: 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65  >nPage++;.    }e
ecd0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  lse{.      /* Fi
ece0: 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63  nd a page to rec
ecf0: 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f  ycle.  Try to lo
ed00: 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74  cate a page that
ed10: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20   does not.      
ed20: 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f  ** require us to
ed30: 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f   do an fsync() o
ed40: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20  n the journal.. 
ed50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
ed60: 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
ed70: 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20  stSynced;..     
ed80: 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20   /* If we could 
ed90: 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20  not find a page 
eda0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
edb0: 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29  quire an fsync()
edc0: 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
edd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
ede0: 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75  en fsync the jou
edf0: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73  rnal file.  This
ee00: 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76   is a.      ** v
ee10: 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69  ery slow operati
ee20: 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68  on, so we work h
ee30: 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e  ard to avoid it.
ee40: 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a    But sometimes.
ee50: 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27        ** it can'
ee60: 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20  t be helped..   
ee70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
ee80: 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
ee90: 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a    int rc = syncJ
eea0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 30  ournal(pPager, 0
eeb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
eec0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
eed0: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
eee0: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
eef0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ef00: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
ef10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ef20: 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
ef30: 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a  pFirst;.      }.
ef40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
ef50: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
ef60: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
ef70: 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61  e page to the da
ef80: 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
ef90: 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20 20  t is dirty..    
efa0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
efb0: 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
efc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
efd0: 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
efe0: 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 44  .        pPg->pD
eff0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
f000: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
f010: 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
f020: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f030: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f040: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f050: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
f060: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
f070: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f080: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
f090: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f0a0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
f0b0: 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rty==0 );..     
f0c0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
f0d0: 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
f0e0: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
f0f0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
f100: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  en.      ** set 
f110: 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79  the global alway
f120: 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20  sRollback flag, 
f130: 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74  thus disabling t
f140: 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  he.      ** sqli
f150: 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  te_dont_rollback
f160: 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  () optimization 
f170: 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20  for the rest of 
f180: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
f190: 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73  ..      ** It is
f1a0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f   necessary to do
f1b0: 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68   this because th
f1c0: 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c  e page marked al
f1d0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20  waysRollback.   
f1e0: 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72     ** might be r
f1f0: 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
f200: 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
f210: 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
f220: 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20  't remember.    
f230: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
f240: 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
f250: 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
f260: 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
f270: 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  es must.      **
f280: 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   be marked as al
f290: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f  waysRollback fro
f2a0: 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20  m here on out.. 
f2b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
f2c0: 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
f2d0: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
f2e0: 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
f2f0: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
f300: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
f310: 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61  nlink the old pa
f320: 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
f330: 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61   list and the ha
f340: 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  sh table.      *
f350: 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  /.      unlinkPa
f360: 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ge(pPg);.      p
f370: 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a  Pager->nOvfl++;.
f380: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
f390: 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
f3a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
f3b0: 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
f3c0: 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
f3d0: 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
f3e0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d   sqlite3CheckMem
f3f0: 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ory(pPager->aInJ
f400: 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b  ournal, pgno/8);
f410: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f420: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
f430: 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  en );.      pPg-
f440: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50  >inJournal = (pP
f450: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
f460: 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
f470: 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
f480: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
f490: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
f4a0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
f4b0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
f4c0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
f4d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
f4e0: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
f4f0: 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  mt && (int)pgno<
f500: 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
f510: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  e.             &
f520: 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  & (pPager->aInSt
f530: 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  mt[pgno/8] & (1<
f540: 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29  <(pgno&7)))!=0 )
f550: 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  {.      page_add
f560: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
f570: 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
f580: 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65       page_remove
f590: 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
f5a0: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
f5b0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
f5c0: 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20      pPg->nRef = 
f5d0: 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70  1;.    REFINFO(p
f5e0: 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  Pg);.    pPager-
f5f0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d  >nRef++;.    h =
f600: 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f   pager_hash(pgno
f610: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
f620: 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
f630: 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50  aHash[h];.    pP
f640: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
f650: 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
f660: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
f670: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
f680: 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
f690: 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
f6a0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
f6b0: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
f6c0: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
f6d0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  f( pPager->nExtr
f6e0: 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  a>0 ){.      mem
f6f0: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
f700: 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  RA(pPg), 0, pPag
f710: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
f720: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
f730: 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71  r->dbSize<0 ) sq
f740: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
f750: 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
f760: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
f770: 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
f780: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
f790: 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
f7a0: 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
f7b0: 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
f7c0: 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
f7d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
f7e0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
f7f0: 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
f800: 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  gno ){.      mem
f810: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
f820: 41 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54  A(pPg), 0, SQLIT
f830: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
f840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
f850: 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73  nt rc;.      ass
f860: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
f870: 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  Db==0 );.      s
f880: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
f890: 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d  ager->fd, (pgno-
f8a0: 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45  1)*(off_t)SQLITE
f8b0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
f8c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f8d0: 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66  sRead(&pPager->f
f8e0: 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  d, PGHDR_TO_DATA
f8f0: 28 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41  (pPg), SQLITE_PA
f900: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
f910: 54 52 41 43 45 32 28 22 46 45 54 43 48 20 70 61  TRACE2("FETCH pa
f920: 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  ge %d\n", pPg->p
f930: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  gno);.      CODE
f940: 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
f950: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
f960: 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20  g->pgno, 3);.   
f970: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f980: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f990: 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a 65 3b 0a  off_t fileSize;.
f9a0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
f9b0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
f9c0: 50 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53  Pager->fd,&fileS
f9d0: 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ize)!=SQLITE_OK.
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
f9f0: 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f  | fileSize>=pgno
fa00: 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  *SQLITE_PAGE_SIZ
fa10: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
fa20: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
fa30: 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  f(PGHDR_TO_DATA(
fa40: 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20  pPg));.         
fa50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fa60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fa70: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
fa80: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
fa90: 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  0, SQLITE_PAGE_S
faa0: 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  IZE);.        }.
fab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fac0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
fad0: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
fae0: 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20   is in the page 
faf0: 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50  cache. */.    pP
fb00: 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20  ager->nHit++;.  
fb10: 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
fb20: 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
fb30: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
fb40: 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
fb50: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fb60: 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
fb70: 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
fb80: 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
fb90: 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
fba0: 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
fbb0: 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
fbc0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
fbd0: 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
fbe0: 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
fbf0: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
fc00: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
fc10: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
fc20: 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
fc30: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
fc40: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
fc50: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
fc60: 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
fc70: 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
fc80: 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
fc90: 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
fca0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
fcb0: 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
fcc0: 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
fcd0: 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
fce0: 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
fcf0: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
fd00: 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
fd10: 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
fd20: 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76  r happened..*/.v
fd30: 6f 69 64 20 2a 73 71 6c 69 74 65 33 70 61 67 65  oid *sqlite3page
fd40: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
fd50: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
fd60: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
fd70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
fd80: 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
fd90: 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
fda0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
fdb0: 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45  Mask & ~(PAGER_E
fdc0: 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20  RR_FULL) ){.    
fdd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
fde0: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
fdf0: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
fe00: 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
fe10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67   return 0;.  pag
fe20: 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
fe30: 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
fe40: 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
fe50: 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
fe60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
fe70: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
fe80: 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
fe90: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
fea0: 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
feb0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
fec0: 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
fed0: 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
fee0: 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
fef0: 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
ff00: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
ff10: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
ff20: 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
ff30: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
ff40: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
ff50: 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
ff60: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
ff70: 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
ff80: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
ff90: 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
ffa0: 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44  e.  */.  pPg = D
ffb0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
ffc0: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ta);.  assert( p
ffd0: 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
ffe0: 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52  pPg->nRef--;.  R
fff0: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
10000 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
10010 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
10020 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
10030 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
10040 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
10050 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
10060 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
10070 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
10080 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
10090 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
100a0 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
100b0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
100c0 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20  pNextFree = 0;. 
100d0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
100e0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  e = pPager->pLas
100f0 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
10100 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Last = pPg;.    
10110 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
10120 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
10130 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
10140 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20  tFree = pPg;.   
10150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
10160 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
10170 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
10180 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
10190 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
101a0 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b  irstSynced==0 ){
101b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
101c0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
101d0 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
101e0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
101f0 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
10200 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
10210 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  r(pData, pPager-
10220 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
10230 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e  }.  .    /* When
10240 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68   all pages reach
10250 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64   the freelist, d
10260 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63  rop the read loc
10270 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  k from.    ** th
10280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
10290 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
102a0 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
102b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
102c0 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nRef>=0 );.    i
102d0 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
102e0 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d  =0 && !pPager->m
102f0 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 70 61  emDb ){.      pa
10300 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
10310 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
10320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
10340 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
10350 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
10360 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
10370 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
10380 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
10390 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
103a0 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
103b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
103c0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
103d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
103e0 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
103f0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
10400 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
10410 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
10420 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
10430 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
10440 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
10450 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
10460 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
10470 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
10480 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
10490 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
104a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
104b0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
104c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
104d0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
104e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  );.  sqlite3page
104f0 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
10500 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  er);.  pPager->a
10510 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
10520 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
10530 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
10540 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
10550 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  aInJournal==0 ){
10560 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  .    sqlite3OsUn
10570 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
10580 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
10590 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
105a0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
105b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
105c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
105d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
105e0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61  penExclusive(pPa
105f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
10600 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67  pPager->jfd,pPag
10610 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
10620 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10630 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
10640 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
10650 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
10660 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
10670 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
10680 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
10690 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
106a0 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
106b0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
106c0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
106d0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
106e0 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  N;.  }.  sqlite3
106f0 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
10700 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
10710 72 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  ry, &pPager->jfd
10720 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
10730 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
10740 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
10750 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50  tarted = 0;.  pP
10760 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
10770 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c   0;.  pPager->al
10780 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
10790 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
107a0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
107b0 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
107c0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
107d0 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
107e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
107f0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
10800 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
10810 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 2f  er->dbSize;..  /
10820 2a 20 43 72 65 61 74 65 20 74 68 65 20 68 65 61  * Create the hea
10830 64 65 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  der for the jour
10840 6e 61 6c 3a 0a 20 20 2a 2a 20 2d 20 38 20 62 79  nal:.  ** - 8 by
10850 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
10860 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
10870 6f 72 6d 61 74 2e 0a 20 20 2a 2a 20 2d 20 34 20  ormat..  ** - 4 
10880 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
10890 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
108a0 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
108b0 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 20  nc mode is on.. 
108c0 20 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4d   ** - 4 bytes: M
108d0 61 67 69 63 20 75 73 65 64 20 66 6f 72 20 70 61  agic used for pa
108e0 67 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a 20 20  ge checksums..  
108f0 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
10900 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
10910 61 67 65 20 63 6f 75 6e 74 2e 0a 20 20 2a 2a 20  age count..  ** 
10920 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
10930 72 20 6f 66 20 62 79 74 65 73 20 72 65 73 65 72  r of bytes reser
10940 76 65 64 20 66 6f 72 20 6d 61 73 74 65 72 20 6a  ved for master j
10950 6f 75 72 6e 61 6c 20 70 74 72 20 28 6e 4d 61 73  ournal ptr (nMas
10960 74 65 72 29 0a 20 20 2a 2a 20 2d 20 6e 4d 61 73  ter).  ** - nMas
10970 74 65 72 20 62 79 74 65 73 3a 20 53 70 61 63 65  ter bytes: Space
10980 20 66 6f 72 20 61 20 6d 61 73 74 65 72 20 6a 6f   for a master jo
10990 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2e 0a 20  urnal pointer.. 
109a0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
109b0 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
109c0 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
109d0 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
109e0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
109f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10a00 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  OK ){.    rc = w
10a10 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
10a20 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
10a30 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66  >noSync ? 0xffff
10a40 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20  ffff : 0);.  }. 
10a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10a60 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
10a70 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
10a80 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
10a90 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
10aa0 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20  cksumInit);.    
10ab0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10ac0 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
10ad0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
10ae0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
10af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10b00 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
10b10 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
10b20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
10b30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10b40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10b50 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
10b60 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
10b70 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 29  pPager->nMaster)
10b80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10b90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10ba0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
10bb0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 32 34 20  pPager->jfd, 24 
10bc0 2b 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65  + pPager->nMaste
10bd0 72 20 2d 20 31 29 3b 0a 20 20 20 20 72 63 20 3d  r - 1);.    rc =
10be0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10bf0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c  &pPager->jfd, "\
10c00 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  000", 1);.  }.  
10c10 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
10c20 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
10c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10c40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
10c50 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50  er_stmt_begin(pP
10c60 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
10c70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10c80 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
10c90 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
10ca0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
10cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10cc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10cd0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
10ce0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a  .  return rc;  .
10cf0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
10d00 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
10d10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
10d20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
10d30 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
10d40 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
10d50 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
10d60 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
10d70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73  ager_commit() is
10d80 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
10d90 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
10da0 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
10db0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
10dc0 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
10dd0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
10de0 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
10df0 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  _unref() is call
10e00 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
10e10 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
10e20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
10e30 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
10e40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10e50 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
10e60 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
10e70 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
10e80 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
10e90 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
10ea0 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
10eb0 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
10ec0 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
10ed0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
10ee0 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
10ef0 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
10f00 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
10f10 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
10f20 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
10f30 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
10f40 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
10f50 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
10f60 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
10f70 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
10f80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
10f90 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
10fa0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
10fb0 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
10fc0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
10fd0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
10fe0 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
10ff0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
11000 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
11010 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
11020 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
11030 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
11040 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
11050 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
11060 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
11070 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
11080 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
11090 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
110a0 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
110b0 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
110c0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
110d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
110e0 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20  ager_begin(void 
110f0 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 4d 61 73  *pData, int nMas
11100 74 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ter){.  PgHdr *p
11110 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
11120 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
11130 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
11140 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
11150 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11160 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
11170 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
11180 74 28 20 6e 4d 61 73 74 65 72 3e 3d 30 20 29 3b  t( nMaster>=0 );
11190 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
111a0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
111b0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
111c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
111d0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
111e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
111f0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
11200 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
11210 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
11220 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
11230 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
11240 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
11250 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
11260 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
11270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11280 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20  int busy = 1;.  
11290 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
112a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
112b0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
112c0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
112d0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72  .      }while( r
112e0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
112f0 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  & .          pPa
11300 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
11310 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  r && .          
11320 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
11330 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a  dler->xFunc && .
11340 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
11350 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
11360 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42  xFunc(pPager->pB
11370 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67  usyHandler->pArg
11380 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20 20  , busy++).      
11390 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
113a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
113b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
113c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
113d0 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20 3d  Pager->nMaster =
113e0 20 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20 20   nMaster;.      
113f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
11400 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
11410 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69        pPager->di
11420 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
11430 20 20 20 20 54 52 41 43 45 33 28 22 54 52 41 4e      TRACE3("TRAN
11440 53 41 43 54 49 4f 4e 20 25 64 20 6e 4d 61 73 74  SACTION %d nMast
11450 65 72 3d 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  er=%d\n", pPager
11460 2d 3e 66 64 2e 68 2c 20 6e 4d 61 73 74 65 72 29  ->fd.h, nMaster)
11470 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
11480 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
11490 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
114a0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
114b0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
114c0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
114d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
114e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
114f0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
11500 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
11510 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
11520 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
11530 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
11540 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
11550 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
11560 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
11570 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
11580 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
11590 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
115a0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
115b0 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
115c0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
115d0 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
115e0 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
115f0 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
11600 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
11610 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
11620 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
11630 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
11640 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
11650 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
11660 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
11670 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
11680 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
11690 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
116a0 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
116b0 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
116c0 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
116d0 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
116e0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
116f0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
11700 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
11710 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
11720 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
11730 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
11740 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
11750 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
11760 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
11770 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
11780 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
11790 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
117a0 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
117b0 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
117c0 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
117d0 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
117e0 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  o sqlite3pager_c
117f0 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
11800 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
11810 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
11820 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
11830 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a  ger_write(void *
11840 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
11850 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
11860 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
11870 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
11880 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
11890 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
118a0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
118b0 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
118c0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
118d0 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ask ){ .    retu
118e0 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
118f0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
11900 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
11910 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
11920 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
11930 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
11940 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
11950 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
11960 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11970 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
11980 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
11990 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
119a0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
119b0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
119c0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
119d0 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
119e0 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72  inStmt || pPager
119f0 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20  ->stmtInUse==0) 
11a00 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
11a10 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
11a20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11a30 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
11a40 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
11a50 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
11a60 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
11a70 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74 74  to be.  ** writt
11a80 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
11a90 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
11aa0 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
11ab0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20  journal.  ** or 
11ac0 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
11ad0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
11ae0 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
11af0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
11b00 65 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20  exists and.  ** 
11b10 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  create it if it 
11b20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  does not..  */. 
11b30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11b40 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
11b50 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73  LOCK );.  rc = s
11b60 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
11b70 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 69  n(pData, 0);.  i
11b80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11b90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
11ba0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
11bb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
11bc0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
11bd0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
11be0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
11bf0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
11c00 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  al ){.    rc = p
11c10 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
11c20 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
11c30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11c40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
11c50 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
11c60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11c70 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  || !pPager->useJ
11c80 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67  ournal );.  pPag
11c90 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
11ca0 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72   1;..  /* The tr
11cb0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
11cc0 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
11cd0 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
11ce0 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a 2a 20 45  VED or an.  ** E
11cf0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
11d00 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
11d10 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
11d20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
11d30 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 74 72 61   to.  ** the tra
11d40 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
11d50 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
11d60 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a  ere already..  *
11d70 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  /.  if( !pPg->in
11d80 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
11d90 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
11da0 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 29  | pPager->memDb)
11db0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e 74   ){.    if( (int
11dc0 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
11dd0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
11de0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
11df0 50 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73 61  Pg;.      u32 sa
11e00 76 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ved;.      if( p
11e10 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
11e20 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
11e30 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
11e40 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
11e50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 54  ager);.        T
11e60 52 41 43 45 32 28 22 4a 4f 55 52 4e 41 4c 20 70  RACE2("JOURNAL p
11e70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  age %d\n", pPg->
11e80 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  pgno);.        a
11e90 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f  ssert( pHist->pO
11ea0 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rig==0 );.      
11eb0 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
11ec0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
11ed0 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
11ee0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
11ef0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
11f00 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
11f10 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
11f20 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
11f30 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
11f40 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
11f50 7d 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69  }.        pPg->i
11f60 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
11f70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11f80 20 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70     u32 cksum = p
11f90 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
11fa0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44  r, pPg->pgno, pD
11fb0 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 73 61  ata);.        sa
11fc0 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48  ved = *(u32*)PGH
11fd0 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29  DR_TO_EXTRA(pPg)
11fe0 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33  ;.        store3
11ff0 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67  2bits(cksum, pPg
12000 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
12010 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 50  ZE);.        szP
12020 67 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g = SQLITE_PAGE_
12030 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20 20 20 20  SIZE+8;.        
12040 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d  store32bits(pPg-
12050 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b  >pgno, pPg, -4);
12060 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
12070 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
12080 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
12090 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
120a0 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
120b0 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29  ->jfd, &((char*)
120c0 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67  pData)[-4], szPg
120d0 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
120e0 33 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20  3("JOURNAL page 
120f0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
12100 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ", pPg->pgno, pP
12110 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
12120 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
12130 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
12140 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
12150 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54    *(u32*)PGHDR_T
12160 4f 5f 45 58 54 52 41 28 70 50 67 29 20 3d 20 73  O_EXTRA(pPg) = s
12170 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  aved;.        if
12180 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
121a0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
121b0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
121c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
121d0 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
121e0 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  RR_FULL;.       
121f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12210 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
12220 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12230 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
12240 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
12250 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
12260 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
12270 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
12280 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70 50  o&7);.        pP
12290 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
122a0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
122b0 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f         pPg->inJo
122c0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20  urnal = 1;.     
122d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
122e0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
122f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
12300 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
12310 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
12320 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
12330 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
12340 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
12350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12370 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
12380 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
12390 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
123a0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
123b0 20 20 20 54 52 41 43 45 33 28 22 41 50 50 45 4e     TRACE3("APPEN
123c0 44 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  D page %d needSy
123d0 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  nc=%d\n", pPg->p
123e0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
123f0 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nc);.    }.    i
12400 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
12410 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12420 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
12430 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12440 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
12450 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
12460 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
12470 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a   not in it,.  **
12480 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
12490 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
124a0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
124b0 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
124c0 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65  t.  ** the state
124d0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
124e0 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
124f0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
12500 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 2a  urnal format.  *
12510 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
12520 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
12530 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
12540 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
12550 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
12560 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
12570 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
12580 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
12590 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
125a0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
125b0 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
125c0 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
125d0 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
125e0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
125f0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
12600 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
12610 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
12620 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
12630 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
12640 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 48 69  ==0 );.      pHi
12650 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
12660 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
12670 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
12680 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
12690 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
126a0 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
126b0 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f  >pStmt, PGHDR_TO
126c0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
126d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
126e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
126f0 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE2("STMT-JOURNA
12700 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  L page %d\n", pP
12710 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 65  g->pgno);.    }e
12720 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  lse{.      store
12730 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f  32bits(pPg->pgno
12740 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20  , pPg, -4);.    
12750 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
12760 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
12770 2c 20 37 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 7);.      rc =
12780 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
12790 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 28  &pPager->stfd, (
127a0 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c  (char*)pData)-4,
127b0 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
127c0 45 2b 34 29 3b 0a 20 20 20 20 20 20 54 52 41 43  E+4);.      TRAC
127d0 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E2("STMT-JOURNAL
127e0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
127f0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
12800 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
12810 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30  ta, pPg->pgno, 0
12820 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12830 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12840 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
12850 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
12860 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
12870 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
12880 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
12890 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
128a0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
128b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
128c0 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  c++;.      asser
128d0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
128e0 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  mt!=0 );.      p
128f0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
12900 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
12910 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
12920 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f  .    }.    page_
12930 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
12940 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pPg);.  }..  /*
12950 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
12960 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
12970 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
12980 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
12990 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
129a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
129b0 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
129c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
129d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
129e0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
129f0 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
12a00 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
12a10 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
12a20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ** to sqlite3pag
12a30 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20  er_write().  In 
12a40 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
12a50 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
12a60 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
12a70 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
12a80 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e   the page..*/.in
12a90 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  t sqlite3pager_i
12aa0 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20  swriteable(void 
12ab0 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
12ac0 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
12ad0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
12ae0 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
12af0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  y;.}../*.** Repl
12b00 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ace the content 
12b10 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
12b20 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d   with the inform
12b30 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69  ation in the thi
12b40 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  rd.** argument..
12b50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
12b60 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61  ger_overwrite(Pa
12b70 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
12b80 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
12b90 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ata){.  void *pP
12ba0 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  age;.  int rc;..
12bb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
12bc0 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
12bd0 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20  pgno, &pPage);. 
12be0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12bf0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
12c00 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
12c10 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
12c20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12c30 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
12c40 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 53 51  pPage, pData, SQ
12c50 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
12c60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12c70 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
12c80 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
12c90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12ca0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
12cb0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
12cc0 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
12cd0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
12ce0 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
12cf0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
12d00 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20  age "pgno" back 
12d10 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
12d20 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
12d30 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
12d40 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
12d50 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
12d60 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
12d70 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
12d80 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
12d90 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
12da0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
12db0 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
12dc0 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
12dd0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
12de0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
12df0 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
12e00 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
12e10 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
12e20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
12e30 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
12e40 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70   the.** sqlite3p
12e50 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
12e60 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
12e70 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
12e80 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
12e90 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
12ea0 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
12eb0 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
12ec0 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
12ed0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
12ee0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12ef0 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
12f00 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
12f10 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
12f20 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
12f30 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
12f40 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
12f50 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
12f60 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
12f70 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
12f80 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
12f90 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
12fa0 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
12fb0 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
12fc0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
12fd0 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
12fe0 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
12ff0 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
13000 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
13010 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
13020 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
13030 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
13040 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
13050 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
13060 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
13070 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
13080 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
13090 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
130a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
130b0 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
130c0 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
130d0 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
130e0 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
130f0 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  se the page cont
13100 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c  ains.** critical
13110 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
13120 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
13130 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62  it gets rolled b
13140 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20  ack in spite.** 
13150 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  of the dont_roll
13160 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
13170 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
13180 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67  r_dont_write(Pag
13190 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
131a0 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
131b0 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 70  *pPg;..  pPg = p
131c0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
131d0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67  er, pgno);.  pPg
131e0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
131f0 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20   = 1;.  if( pPg 
13200 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  && pPg->dirty ){
13210 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
13220 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50  >dbSize==(int)pP
13230 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65  g->pgno && pPage
13240 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50  r->origDbSize<pP
13250 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
13260 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
13270 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61   pages is the la
13280 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  st page in the f
13290 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
132a0 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20   has grown.     
132b0 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63   ** during the c
132c0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
132d0 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20  on, then do NOT 
132e0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
132f0 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a   clean..      **
13300 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   When the databa
13310 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77  se file grows, w
13320 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65  e must make sure
13330 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
13340 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74  age.      ** get
13350 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61  s written at lea
13360 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20  st once so that 
13370 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69  the disk file wi
13380 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63  ll be the correc
13390 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e  t.      ** size.
133a0 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77   If you do not w
133b0 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61  rite this page a
133c0 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
133d0 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
133e0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64   on the disk end
133f0 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73  s up being too s
13400 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c  mall, that can l
13410 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a  ead to database.
13420 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74        ** corrupt
13430 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e  ion during the n
13440 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ext transaction.
13450 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
13460 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45  lse{.      TRACE
13470 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
13480 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
13490 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66 64  pgno, pPager->fd
134a0 2e 68 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  .h);.      pPg->
134b0 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d  dirty = 0;.    }
134c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
134d0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
134e0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
134f0 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
13500 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
13510 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
13520 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
13530 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
13540 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
13550 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
13560 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
13570 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
13580 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
13590 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
135a0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
135b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
135c0 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
135d0 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  k(void *pData){.
135e0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
135f0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
13600 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
13610 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
13620 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  er;..  if( pPage
13630 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
13640 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61  EXCLUSIVE || pPa
13650 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
13660 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
13670 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
13680 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
13690 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
136a0 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  k || pPager->mem
136b0 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  Db ) return;.  i
136c0 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
136d0 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
136e0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
136f0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
13700 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13710 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
13720 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
13730 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
13740 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
13750 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
13760 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
13770 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
13780 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
13790 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
137a0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
137b0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
137c0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
137d0 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
137e0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
137f0 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e  .    TRACE3("DON
13800 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
13810 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
13820 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e  ->pgno, pPager->
13830 66 64 2e 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  fd.h);.  }.  if(
13840 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
13850 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
13860 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
13870 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
13880 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  mtSize ){.    as
13890 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
138a0 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
138b0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
138c0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
138d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
138e0 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
138f0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
13900 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
13910 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
13920 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
13930 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
13940 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  Pg);.  }.}.../*.
13950 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
13960 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
13970 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
13980 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
13990 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
139a0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  teFree(pHist->pO
139b0 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  rig);.  sqliteFr
139c0 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
139d0 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
139e0 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
139f0 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
13a00 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
13a10 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
13a20 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
13a30 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
13a40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
13a50 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
13a60 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
13a70 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
13a80 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
13a90 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
13aa0 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
13ab0 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
13ac0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
13ad0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
13ae0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
13af0 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
13b00 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
13b10 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
13b20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
13b30 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask==PAGER_ERR_F
13b40 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
13b50 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
13b60 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
13b70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13b80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
13b90 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
13ba0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
13bb0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
13bc0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
13bd0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 ){.    rc = pa
13be0 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
13bf0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
13c00 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
13c10 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
13c20 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
13c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13c40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41  ERROR;.  }.  TRA
13c50 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
13c60 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29  ", pPager->fd.h)
13c70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
13c80 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 67  memDb ){.    pPg
13c90 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
13ca0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
13cb0 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ger);.    while(
13cc0 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c   pPg ){.      cl
13cd0 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52  earHistory(PGHDR
13ce0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
13cf0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50  ager));.      pP
13d00 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
13d10 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
13d20 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
13d30 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
13d40 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
13d50 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
13d60 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
13d70 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
13d80 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  y;.    }.    pPa
13d90 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
13da0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
13db0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
13dc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13dd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
13de0 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
13df0 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ache==0 ){.    /
13e00 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69  * Exit early (wi
13e10 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20  thout doing the 
13e20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73  time-consuming s
13e30 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63  qlite3OsSync() c
13e40 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20  alls).    ** if 
13e50 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
13e60 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  no changes to th
13e70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
13e80 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
13e90 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
13ea0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
13eb0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
13ec0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
13ed0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
13ee0 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
13ef0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
13f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f10 4f 70 65 6e 20 29 3b 0a 23 69 66 20 30 0a 20 20  Open );.#if 0.  
13f20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
13f30 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69  (pPager, 0);.  i
13f40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13f50 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d   ){.    goto com
13f60 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
13f70 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
13f80 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
13f90 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
13fa0 70 50 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pPg ){.    rc = 
13fb0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
13fc0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
13fd0 66 28 20 72 63 20 7c 7c 20 28 21 70 50 61 67 65  f( rc || (!pPage
13fe0 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71 6c  r->noSync && sql
13ff0 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67  ite3OsSync(&pPag
14000 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f  er->fd)!=SQLITE_
14010 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  OK) ){.      got
14020 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a  o commit_abort;.
14030 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14040 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
14050 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72  ager_sync(pPager
14060 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
14070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14080 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f   goto commit_abo
14090 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  rt;.  }.  rc = p
140a0 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
140b0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
140c0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
140d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20  .  return rc;.. 
140e0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
140f0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
14100 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20  rong during the 
14110 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
14120 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72    */.commit_abor
14130 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
14140 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
14150 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
14160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14170 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14180 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  FULL;.  }.  retu
14190 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
141a0 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
141b0 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
141c0 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
141d0 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
141e0 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
141f0 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
14200 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
14210 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
14220 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
14230 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
14240 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
14250 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
14260 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
14270 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
14280 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
14290 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
142a0 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28  cking protocol (
142b0 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29  SQLITE_PROTOCOL)
142c0 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
142d0 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
142e0 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
142f0 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
14300 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
14310 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
14320 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
14330 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
14340 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
14350 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
14360 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
14370 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
14380 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
14390 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
143a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
143b0 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
143c0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
143d0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
143e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  ){.  int rc;.  T
143f0 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
14400 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
14410 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d.h);.  if( pPag
14420 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
14430 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
14440 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
14450 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
14460 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
14470 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
14480 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74      if( !p->dirt
14490 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
144a0 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
144b0 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
144c0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
144d0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
144e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
144f0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
14500 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70   pHist->pOrig, p
14510 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
14520 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32  ;.        TRACE2
14530 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20  ("ROLLBACK-PAGE 
14540 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b  %d\n", p->pgno);
14550 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14560 20 20 20 20 20 20 54 52 41 43 45 32 28 22 50 41        TRACE2("PA
14570 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 5c 6e  GE %d is clean\n
14580 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  ", p->pgno);.   
14590 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
145a0 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
145b0 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
145c0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
145d0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
145e0 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b    p->inStmt = 0;
145f0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53  .      p->pPrevS
14600 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74  tmt = p->pNextSt
14610 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
14620 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
14630 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
14640 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
14650 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
14660 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
14670 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
14680 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
14690 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
146a0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
146b0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
146c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
146d0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
146e0 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
146f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14700 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
14710 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
14720 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
14730 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14740 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
14750 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
14760 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
14770 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   && pPager->errM
14780 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask!=PAGER_ERR_F
14790 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
147a0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
147b0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
147c0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
147d0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
147e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
147f0 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
14800 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
14810 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
14820 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
14830 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
14840 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14850 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
14860 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d  ager);.    rc2 =
14870 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
14880 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14890 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
148a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
148b0 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  rc2;.    }.  }el
148c0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
148d0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
148e0 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66  er, 1);.  }.  if
148f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14900 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14910 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
14920 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
14930 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  |= PAGER_ERR_COR
14940 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RUPT;.  }.  pPag
14950 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
14960 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14970 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
14980 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
14990 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
149a0 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
149b0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
149c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
149d0 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
149e0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
149f0 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61  lite3pager_isrea
14a00 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
14a10 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
14a20 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
14a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14a40 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
14a50 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
14a60 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
14a70 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67  .int *sqlite3pag
14a80 65 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a  er_stats(Pager *
14a90 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
14aa0 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b  c int a[9];.  a[
14ab0 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
14ac0 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
14ad0 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
14ae0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
14af0 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
14b00 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
14b10 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
14b20 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
14b30 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20  ager->errMask;. 
14b40 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
14b50 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
14b60 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
14b70 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[8] = pPager->n
14b80 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  Ovfl;.  return a
14b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
14ba0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
14bb0 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
14bc0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14bd0 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
14be0 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
14bf0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
14c00 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
14c10 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
14c20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
14c30 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
14c40 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
14c50 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
14c60 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
14c70 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
14c80 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
14c90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
14ca0 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50  ger_stmt_begin(P
14cb0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14cc0 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
14cd0 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
14ce0 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61  PNAME_SIZE];.  a
14cf0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
14d00 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 54  stmtInUse );.  T
14d10 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
14d20 4e 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  N %d\n", pPager-
14d30 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50  >fd.h);.  if( pP
14d40 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
14d50 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
14d60 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  nUse = 1;.    pP
14d70 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
14d80 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
14d90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14da0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
14db0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
14dc0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61  lOpen ){.    pPa
14dd0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
14de0 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  n = 1;.    retur
14df0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14e00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
14e10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
14e20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ;.  pPager->aInS
14e30 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
14e40 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
14e50 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
14e60 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
14e70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
14e80 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65  te3OsLock(&pPage
14e90 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
14ea0 43 4b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  CK);.    return 
14eb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14ec0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
14ed0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
14ee0 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
14ef0 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
14f00 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
14f10 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
14f20 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
14f30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14f40 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 0a  ->stmtJSize == .
14f50 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
14f60 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  *JOURNAL_PG_SZ(p
14f70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
14f80 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
14f90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
14fa0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 0a  er->stmtJSize =.
14fb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
14fc0 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  c*JOURNAL_PG_SZ(
14fd0 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
14fe0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
14ff0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
15000 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
15010 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50  bSize;.  if( !pP
15020 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
15030 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15040 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  e3pager_opentemp
15050 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d  (zTemp, &pPager-
15060 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20  >stfd);.    if( 
15070 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
15080 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
15090 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
150a0 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  n = 1;.    pPage
150b0 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
150c0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
150d0 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
150e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
150f0 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66  ;. .stmt_begin_f
15100 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61  ailed:.  if( pPa
15110 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a  ger->aInStmt ){.
15120 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
15130 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b  Pager->aInStmt);
15140 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
15150 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
15160 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15170 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61  .** Commit a sta
15180 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
15190 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
151a0 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  _commit(Pager *p
151b0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
151c0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
151d0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
151e0 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54  g, *pNext;.    T
151f0 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d  RACE2("STMT-COMM
15200 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  IT %d\n", pPager
15210 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69 66 28  ->fd.h);.    if(
15220 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
15230 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15240 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
15250 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  stfd, 0);.      
15260 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  /* sqlite3OsTrun
15270 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74  cate(&pPager->st
15280 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
15290 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
152a0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a  ger->aInStmt );.
152b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
152c0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
152d0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
152e0 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
152f0 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
15300 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
15310 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
15320 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
15330 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
15340 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
15350 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
15360 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
15370 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
15380 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
15390 62 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  b ){.        PgH
153a0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
153b0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
153c0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
153d0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
153e0 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
153f0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
15400 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
15410 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
15420 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
15430 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
15440 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
15450 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
15460 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
15470 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
15480 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15490 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
154a0 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
154b0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
154c0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f  te3pager_stmt_ro
154d0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
154e0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
154f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
15500 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
15510 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c  TRACE2("STMT-ROL
15520 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61  LBACK %d\n", pPa
15530 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
15540 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
15550 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  b ){.      PgHdr
15560 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
15570 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
15580 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
15590 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
155a0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
155b0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
155c0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
155d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
155e0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
155f0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
15600 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
15610 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
15620 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
15630 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
15640 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
15650 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
15660 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
15670 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
15680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
15690 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
156a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
156b0 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
156c0 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
156d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
156e0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
156f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
15700 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
15710 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
15720 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
15730 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
15740 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
15750 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
15760 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
15770 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
15780 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15790 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
157a0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
157b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
157c0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
157d0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
157e0 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
157f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
15800 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
15810 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
15820 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
15830 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
15840 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
15850 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20  er_set_codec(.  
15860 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
15870 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
15880 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
15890 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
158a0 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
158b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
158c0 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
158d0 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
158e0 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  decArg;.}../*.**
158f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15900 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
15910 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  ment the databas
15920 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
15930 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64  unter,.** stored
15940 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74   at byte 24 of t
15950 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
15960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15970 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
15980 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
15990 67 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ger){.  void *pP
159a0 61 67 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  age;.  PgHdr *pP
159b0 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e  gHdr;.  u32 chan
159c0 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e  ge_counter;.  in
159d0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  t rc;..  /* Open
159e0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
159f0 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
15a00 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
15a10 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
15a20 65 72 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a  er, 1, &pPage);.
15a30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15a40 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
15a50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
15a60 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
15a70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15a80 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15a90 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  rc;..  /* Read t
15aa0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
15ab0 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   at byte 24. */.
15ac0 20 20 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f    pPgHdr = DATA_
15ad0 54 4f 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b  TO_PGHDR(pPage);
15ae0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
15af0 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69  r = retrieve32bi
15b00 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a  ts(pPgHdr, 24);.
15b10 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
15b20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
15b30 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
15b40 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
15b50 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f  . */.  change_co
15b60 75 6e 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65  unter++;.  store
15b70 33 32 62 69 74 73 28 63 68 61 6e 67 65 5f 63 6f  32bits(change_co
15b80 75 6e 74 65 72 2c 20 70 50 67 48 64 72 2c 20 32  unter, pPgHdr, 2
15b90 34 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  4);..  /* Releas
15ba0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
15bb0 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ence. */.  sqlit
15bc0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
15bd0 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  age);.  return S
15be0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15bf0 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
15c00 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
15c10 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
15c20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
15c30 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
15c40 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
15c50 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
15c60 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
15c70 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
15c80 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
15c90 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
15ca0 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
15cb0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
15cc0 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
15cd0 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
15ce0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
15cf0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
15d00 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
15d10 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
15d20 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c  l is synced, all
15d30 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69   dirty pages wri
15d40 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tten.** to the d
15d50 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
15d60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15d70 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f  le synced. The o
15d80 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a  nly thing that.*
15d90 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  * remains to com
15da0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
15db0 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ion is to delete
15dc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
15dd0 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20  e (or.** master 
15de0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
15df0 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
15e00 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
15e10 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
15e20 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
15e30 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
15e40 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
15e50 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61   to an sqlite3pa
15e60 67 65 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ger_sync() call.
15e70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
15e80 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20  ager_sync(Pager 
15e90 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
15ea0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
15eb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15ec0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  _OK;..  /* If th
15ed0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
15ee0 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
15ef0 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
15f00 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
15f10 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
15f20 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
15f30 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
15f40 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
15f50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
15f60 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
15f70 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
15f80 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  && pPager->dirty
15f90 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48  Cache ){.    PgH
15fa0 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73  dr *pPg;.    ass
15fb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
15fc0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20  rnalOpen );..   
15fd0 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
15fe0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
15ff0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
16000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16010 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
16020 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
16030 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
16040 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f  .    rc = syncJo
16050 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
16060 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  aster);.    if( 
16070 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16080 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
16090 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
160a0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
160b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
160c0 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
160d0 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
160e0 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
160f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
16100 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
16110 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
16120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
16130 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
16140 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
16150 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
16160 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
16170 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
16180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
16190 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66  sSync(&pPager->f
161a0 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  d);.    }..    p
161b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
161c0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
161d0 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72  ..sync_exit:.  r
161e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
161f0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
16200 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16210 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
16220 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b  of the file lock
16230 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
16240 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74  ager..** The ret
16250 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65  urn value is one
16260 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41   of NO_LOCK, SHA
16270 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
16280 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44  ED_LOCK,.** PEND
16290 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43  ING_LOCK, or EXC
162a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a  LUSIVE_LOCK..*/.
162b0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
162c0 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72  _lockstate(Pager
162d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
162e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c  urn pPager->fd.l
162f0 6f 63 6b 74 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  ocktype;.}.#endi
16300 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
16310 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  _TEST./*.** Prin
16320 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61  t a listing of a
16330 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61  ll referenced pa
16340 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65  ges and their re
16350 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  f count..*/.void
16360 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
16370 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61  fdump(Pager *pPa
16380 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
16390 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  Pg;.  for(pPg=pP
163a0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
163b0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
163c0 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  ll){.    if( pPg
163d0 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74  ->nRef<=0 ) cont
163e0 69 6e 75 65 3b 0a 20 20 20 20 70 72 69 6e 74 66  inue;.    printf
163f0 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d  ("PAGE %3d addr=
16400 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e  0x%08x nRef=%d\n
16410 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
16420 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52  pgno, (int)PGHDR
16430 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
16440 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d  Pg->nRef);.  }.}
16450 0a 23 65 6e 64 69 66 0a                          .#endif.