/ Hex Artifact Content
Login

Artifact ec34fbae1a23228cb3743cf7cd8eba1af8e4cd5c:


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 33  : pager.c,v 1.13
0350: 37 20 32 30 30 34 2f 30 36 2f 32 33 20 31 30 3a  7 2004/06/23 10:
0360: 34 33 3a 31 30 20 64 61 6e 69 65 6c 6b 31 39 37  43:10 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 61 73 73 65 72  dr *pPg;.  asser
47c0: 74 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  t( !pPager->memD
47d0: 62 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  b );.  if( pPage
47e0: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
47f0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
4800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4810: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61  .  }.  sqlite3pa
4820: 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
4830: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
4840: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
4850: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
4860: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73  Close(&pPager->s
4870: 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tfd);.    pPager
4880: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
4890: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
48a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
48b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
48c0: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
48d0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
48e0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
48f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
4900: 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
4910: 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  rnal);.    sqlit
4920: 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
4930: 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  InJournal );.   
4940: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
4950: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nal = 0;.    for
4960: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
4970: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
4980: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
4990: 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
49a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
49b0: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
49c0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
49d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
49e0: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
49f0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
4a00: 72 2d 3e 6e 4d 61 73 74 65 72 20 3d 20 30 3b 0a  r->nMaster = 0;.
4a10: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
4a20: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
4a30: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
4a40: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
4a50: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   || pPager->useJ
4a60: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ournal==0 );.  }
4a70: 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  .  sqlite3OsUnlo
4a80: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
4a90: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
4aa0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
4ab0: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
4ac0: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
4ad0: 7a 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ze = 0;.  return
4ae0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4af0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
4b00: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
4b10: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
4b20: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
4b30: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
4b40: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
4b50: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
4b60: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
4b70: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
4b80: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
4b90: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
4ba0: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
4bb0: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
4bc0: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
4bd0: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
4be0: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
4bf0: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
4c00: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
4c10: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
4c20: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
4c30: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
4c40: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
4c50: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
4c60: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
4c70: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
4c80: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
4c90: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
4ca0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
4cb0: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
4cc0: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
4cd0: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
4ce0: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
4cf0: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
4d00: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
4d10: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
4d20: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
4d30: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
4d40: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
4d50: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
4d60: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
4d70: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
4d80: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
4d90: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
4da0: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
4db0: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
4dc0: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
4dd0: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
4de0: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
4df0: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
4e00: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
4e10: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
4e20: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
4e30: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
4e40: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
4e50: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
4e60: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
4e70: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
4e80: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
4e90: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
4ea0: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
4eb0: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
4ec0: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
4ed0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
4ee0: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
4ef0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
4f00: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
4f10: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
4f20: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
4f30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44  , const char *aD
4f40: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
4f50: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
4f60: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
4f70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
4f80: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
4f90: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
4fa0: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
4fb0: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
4fc0: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
4fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
4fe0: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
4ff0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5000: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
5010: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
5020: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
5030: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a  is one page..**.
5040: 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d  ** If useCksum==
5050: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
5060: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
5070: 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20   use checksums. 
5080: 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72   Checksums.** ar
5090: 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74  e not used in st
50a0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
50b0: 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65   because stateme
50c0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e  nt journals do n
50d0: 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75  ot.** need to su
50e0: 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c  rvive power fail
50f0: 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ures..*/.static 
5100: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
5110: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65  ck_one_page(Page
5120: 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c  r *pPager, OsFil
5130: 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43  e *jfd, int useC
5140: 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ksum){.  int rc;
5150: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
5180: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
5190: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
51a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
51b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
51c0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
51d0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
51e0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
5210: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
5220: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44 61  king */.  u8 aDa
5230: 74 61 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ta[SQLITE_PAGE_S
5240: 49 5a 45 5d 3b 20 20 20 2f 2a 20 53 74 6f 72 65  IZE];   /* Store
5250: 20 64 61 74 61 20 68 65 72 65 20 2a 2f 0a 0a 20   data here */.. 
5260: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5270: 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  (jfd, &pgno);.  
5280: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5290: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
52a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
52b0: 65 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c  ead(jfd, &aData,
52c0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
52d0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
52e0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
52f0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74   rc;..  /* Sanit
5300: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
5310: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
5320: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
5330: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
5340: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
5350: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
5360: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
5370: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5380: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
5390: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
53a0: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
53b0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
53c0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
53d0: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
53e0: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
53f0: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
5400: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
5410: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
5420: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
5430: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
5440: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
5450: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75   }.  if( pgno>(u
5460: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
5470: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
5480: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5490: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73    }.  if( useCks
54a0: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  um ){.    rc = r
54b0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
54c0: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
54d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
54e0: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
54f0: 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  sum(pPager, pgno
5500: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
5510: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
5520: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
5530: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
5540: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
5550: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
5560: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
5570: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
5580: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
5590: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
55a0: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
55b0: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
55c0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
55d0: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
55e0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
55f0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
5600: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
5610: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
5620: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5630: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
5640: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
5650: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
5660: 20 20 2a 2a 0a 20 20 2a 2a 20 46 49 58 20 4d 45    **.  ** FIX ME
5670: 3a 20 49 64 65 61 6c 6c 79 20 74 68 65 20 70 61  : Ideally the pa
5680: 67 65 20 77 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  ge would only be
5690: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
56a0: 74 79 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ty when the.  **
56b0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
56c0: 45 52 56 45 44 20 73 74 61 74 65 20 69 66 20 69  ERVED state if i
56d0: 74 20 77 61 73 20 64 69 72 74 79 20 77 68 65 6e  t was dirty when
56e0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a   this statement.
56f0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
5700: 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 0a 20   was started. . 
5710: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
5720: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
5730: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
5740: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
5750: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
5760: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
5770: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
5780: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
5790: 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 50  dirty..  */.  pP
57a0: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
57b0: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
57c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
57d0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
57e0: 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 20  XCLUSIVE || pPg 
57f0: 29 3b 0a 20 20 54 52 41 43 45 32 28 22 50 4c 41  );.  TRACE2("PLA
5800: 59 42 41 43 4b 20 70 61 67 65 20 25 64 5c 6e 22  YBACK page %d\n"
5810: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
5820: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
5830: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
5840: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
5850: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
5860: 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29  (pgno-1)*(off_t)
5870: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
5880: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
5890: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
58a0: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 53  er->fd, aData, S
58b0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
58c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
58d0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
58e0: 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
58f0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
5900: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
5910: 65 70 74 20 66 6f 72 20 70 61 67 65 0a 20 20 20  ept for page.   
5920: 20 2a 2a 20 31 20 77 68 69 63 68 20 69 73 20 68   ** 1 which is h
5930: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
5940: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
5950: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
5960: 62 61 73 65 0a 20 20 20 20 2a 2a 20 61 63 74 69  base.    ** acti
5970: 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ve..    */.    v
5980: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
5990: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
59a0: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
59b0: 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 70 44 61 74  o==1 );.    pDat
59c0: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
59d0: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
59e0: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
59f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
5a00: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
5a10: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
5a20: 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a  ){  /*** FIX ME:
5a30: 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65    Should this be
5a40: 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20   xReinit? ***/. 
5a50: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
5a60: 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
5a70: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5a90: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
5aa0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
5ab0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  ){.      pPg->di
5ac0: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
5ad0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
5ae0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 4f 44 45  ;.    }.    CODE
5af0: 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
5b00: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
5b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
5b30: 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
5b40: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
5b50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5b60: 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
5b70: 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
5b80: 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
5b90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5ba0: 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
5bb0: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
5bc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
5bd0: 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
5be0: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
5bf0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
5c00: 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
5c10: 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
5c20: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  is..**.** The ma
5c30: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5c40: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
5c50: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c  ames of all chil
5c60: 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  d journals..** T
5c70: 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74  o tell if a mast
5c80: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
5c90: 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b  e deleted, check
5ca0: 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a   to each of the.
5cb0: 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66  ** children.  If
5cc0: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72   all children ar
5cd0: 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67  e either missing
5ce0: 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72   or do not refer
5cf0: 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65   to.** a differe
5d00: 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nt master journa
5d10: 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73  l, then this mas
5d20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
5d30: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  be deleted..*/.s
5d40: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
5d50: 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20  delmaster(const 
5d60: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
5d70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
5d80: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
5d90: 0a 20 20 4f 73 46 69 6c 65 20 6d 61 73 74 65 72  .  OsFile master
5da0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
5db0: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
5dc0: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
5dd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5de0: 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 6e 4d 61 73   */.  off_t nMas
5df0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
5e00: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
5e10: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
5e20: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
5e30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e40: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
5e50: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
5e60: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
5e70: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
5e80: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
5e90: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
5ea0: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
5eb0: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ence..  */.  mem
5ec0: 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30 2c 20  set(&master, 0, 
5ed0: 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29 29 3b  sizeof(master));
5ee0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5ef0: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
5f00: 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 2c  Master, &master,
5f10: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
5f20: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
5f30: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
5f40: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
5f50: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
5f60: 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61 73 74  OsFileSize(&mast
5f70: 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
5f80: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
5f90: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
5fa0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
5fb0: 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
5fc0: 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
5fd0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
5fe0: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
5ff0: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  Ptr;.    int nMa
6000: 73 74 65 72 50 74 72 3b 20 20 20 2f 2a 20 4e 75  sterPtr;   /* Nu
6010: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
6020: 6c 6f 63 61 74 65 64 20 61 74 20 7a 4d 61 73 74  located at zMast
6030: 65 72 50 74 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  erPtr */..    /*
6040: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
6050: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6060: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
6070: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
6080: 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f    ** sqliteMallo
6090: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
60a0: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
60b0: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  rnal. .    **.  
60c0: 20 20 2a 2a 20 41 6c 73 6f 20 61 6c 6c 6f 63 61    ** Also alloca
60d0: 74 65 20 61 6e 20 65 78 74 72 61 20 28 73 74 72  te an extra (str
60e0: 6c 65 6e 28 7a 4d 61 73 74 65 72 29 2b 31 29 20  len(zMaster)+1) 
60f0: 62 79 74 65 73 2e 20 54 68 69 73 20 73 70 61 63  bytes. This spac
6100: 65 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a 2a  e is used.    **
6110: 20 74 6f 20 6c 6f 61 64 20 61 20 6d 61 73 74 65   to load a maste
6120: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
6130: 6d 65 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68  me from some oth
6140: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
6150: 74 6f 0a 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  to.    ** check 
6160: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
6170: 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72  this master jour
6180: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  nal file..    */
6190: 0a 20 20 20 20 6e 4d 61 73 74 65 72 50 74 72 20  .    nMasterPtr 
61a0: 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  = strlen(zMaster
61b0: 29 20 2b 20 31 3b 0a 20 20 20 20 7a 4d 61 73 74  ) + 1;.    zMast
61c0: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61  erJournal = (cha
61d0: 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
61e0: 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (nMasterJournal)
61f0: 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 3b 0a 20   + nMasterPtr;. 
6200: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
6210: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
6220: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
6230: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
6240: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
6250: 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
6260: 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
6270: 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
6280: 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
6290: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 6d 61 73  lite3OsRead(&mas
62a0: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
62b0: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
62c0: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nal);.    if( rc
62d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
62e0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
62f0: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
6300: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
6310: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
6320: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
6330: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
6340: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
6350: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
6360: 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29  Exists(zJournal)
6370: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
6380: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
6390: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
63a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
63b0: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
63c0: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
63d0: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
63e0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
63f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
6400: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
6410: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
6420: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
6430: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
6440: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
6450: 20 20 20 4f 73 46 69 6c 65 20 6a 6f 75 72 6e 61     OsFile journa
6460: 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
6470: 4d 61 73 74 65 72 3b 0a 20 20 20 20 20 20 20 20  Master;.        
6480: 6f 66 66 5f 74 20 6a 73 7a 3b 0a 0a 20 20 20 20  off_t jsz;..    
6490: 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f 75 72      memset(&jour
64a0: 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6a  nal, 0, sizeof(j
64b0: 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20 20 20  ournal));.      
64c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
64d0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f  OpenReadOnly(zJo
64e0: 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29  urnal, &journal)
64f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
6500: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6510: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6520: 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c  OsClose(&journal
6530: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
6540: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
6550: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09 2f 2a 20  .        }.../* 
6560: 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  Check if the fil
6570: 65 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  e is big enough 
6580: 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 20  to be a journal 
6590: 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  file.        ** 
65a0: 77 69 74 68 20 74 68 65 20 72 65 71 75 69 72 65  with the require
65b0: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
65c0: 20 6e 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 69   name. If not, i
65d0: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 20 20 20 20  gnore it..      
65e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
65f0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
6600: 69 7a 65 28 26 6a 6f 75 72 6e 61 6c 2c 20 26 6a  ize(&journal, &j
6610: 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  sz);.        if(
6620: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6630: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6640: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72  te3OsClose(&jour
6650: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nal);.          
6660: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
6670: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
6680: 20 20 20 20 20 20 69 66 28 20 6a 73 7a 3c 28 32        if( jsz<(2
6690: 35 2b 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  5+strlen(zMaster
66a0: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
66b0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
66c0: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
66d0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
66e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
66f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 6b  .        /* Seek
6700: 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 69 6e   to the point in
6710: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
6720: 72 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  re the master jo
6730: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 20 20 20  urnal name.     
6740: 20 20 20 2a 2a 20 69 73 20 73 74 6f 72 65 64 2e     ** is stored.
6750: 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
6760: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
6770: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
6780: 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  ed.        ** fr
6790: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 20 20 20 20 20  om malloc..     
67a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
67b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
67c0: 28 26 6a 6f 75 72 6e 61 6c 2c 20 32 30 29 3b 0a  (&journal, 20);.
67d0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
67e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
67f0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
6800: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
6810: 64 33 32 62 69 74 73 28 26 6a 6f 75 72 6e 61 6c  d32bits(&journal
6820: 2c 20 28 75 33 32 2a 29 26 6e 4d 61 73 74 65 72  , (u32*)&nMaster
6830: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
6840: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
6850: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
6860: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  t;.        if( n
6870: 4d 61 73 74 65 72 3e 3d 6e 4d 61 73 74 65 72 50  Master>=nMasterP
6880: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tr ){.          
6890: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
68a0: 61 64 28 26 6a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  ad(&journal, zMa
68b0: 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
68c0: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ptr);.          
68d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
68e0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
68f0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
6900: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
6910: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
6920: 4d 61 73 74 65 72 50 74 72 5b 6e 4d 61 73 74 65  MasterPtr[nMaste
6930: 72 50 74 72 2d 31 5d 3d 3d 27 5c 30 27 20 26 26  rPtr-1]=='\0' &&
6940: 20 21 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72   !strcmp(zMaster
6950: 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 20 29 7b  Ptr, zMaster) ){
6960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
6970: 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
6980: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
6990: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
69a0: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
69b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
69c0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
69d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
69e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
69f0: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
6a00: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
6a10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
6a20: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
6a30: 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61  zMaster);..delma
6a40: 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
6a50: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
6a60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
6a70: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
6a80: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
6a90: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
6aa0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
6ab0: 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  &master);.  }.  
6ac0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6ad0: 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70  .** Make every p
6ae0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
6af0: 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61 74   agree with what
6b00: 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e   is on disk.  In
6b10: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a   other words,.**
6b20: 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73 6b   reread the disk
6b30: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
6b40: 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68 65  ate of the cache
6b50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6b60: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
6b70: 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  fter a rollback 
6b80: 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66  in which some of
6b90: 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68 65   the dirty cache
6ba0: 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65  .** pages had ne
6bb0: 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
6bc0: 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57   out to disk.  W
6bd0: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62  e need to roll b
6be0: 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65  ack the.** cache
6bf0: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
6c00: 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
6c10: 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72 65  do that is to re
6c20: 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e  read the old con
6c30: 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f  tent.** back fro
6c40: 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73  m the disk..*/.s
6c50: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
6c60: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67  reload_cache(Pag
6c70: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
6c80: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
6c90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6ca0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
6cb0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
6cc0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
6cd0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
6ce0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
6cf0: 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  ];.    if( !pPg-
6d00: 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75  >dirty ) continu
6d10: 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  e;.    if( (int)
6d20: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
6d30: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
6d40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6d50: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
6d60: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
6d70: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 28 70 50 67  SIZE*(off_t)(pPg
6d80: 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20  ->pgno-1));.    
6d90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6da0: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
6db0: 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50  , zBuf, SQLITE_P
6dc0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
6dd0: 20 54 52 41 43 45 32 28 22 52 45 46 45 54 43 48   TRACE2("REFETCH
6de0: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
6df0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
6e00: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75  ODEC(pPager, zBu
6e10: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
6e20: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
6e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
6e40: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
6e50: 7a 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f  zBuf, 0, SQLITE_
6e60: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
6e70: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
6e80: 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  Ref==0 || memcmp
6e90: 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f  (zBuf, PGHDR_TO_
6ea0: 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54  DATA(pPg), SQLIT
6eb0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 7b 0a  E_PAGE_SIZE) ){.
6ec0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
6ed0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
6ee0: 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50 41   zBuf, SQLITE_PA
6ef0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
6f00: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
6f10: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
6f20: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
6f30: 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
6f40: 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
6f50: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
6f60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
6f70: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
6f80: 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50  XTRA(pPg), 0, pP
6f90: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
6fa0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6fb0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
6fc0: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   0;.    pPg->dir
6fd0: 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
6fe0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
6ff0: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
7000: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
7010: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
7020: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
7030: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
7040: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
7050: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
7060: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
7070: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7080: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
7090: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
70a0: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
70b0: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
70c0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
70d0: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
70e0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
70f0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
7100: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
7110: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
7120: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
7130: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
7140: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
7150: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
7160: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
7170: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
7180: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
7190: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
71a0: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
71b0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
71c0: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
71d0: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
71e0: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
71f0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
7200: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
7210: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
7220: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
7230: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
7240: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
7250: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
7260: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
7270: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
7280: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
7290: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
72a0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
72b0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
72c0: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
72d0: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
72e0: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
72f0: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
7300: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
7310: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
7320: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
7330: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
7340: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
7350: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
7360: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
7370: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
7380: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
7390: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
73a0: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
73b0: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
73c0: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
73d0: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
73e0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
73f0: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
7400: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
7410: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
7420: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
7430: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
7440: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
7450: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
7460: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
7470: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
7480: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
7490: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
74a0: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
74b0: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
74c0: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
74d0: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
74e0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
74f0: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
7500: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
7510: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
7520: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
7530: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
7540: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
7550: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
7560: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
7570: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
7580: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
7590: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
75a0: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
75c0: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
75d0: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
75e0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
75f0: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
7600: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7610: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
7620: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
7630: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
7640: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
7650: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
7660: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
7670: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
7680: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
7690: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
76a0: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
76b0: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
76c0: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
76d0: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
76e0: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
76f0: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
7700: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
7710: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
7720: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
7730: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
7740: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
7750: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
7760: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
7770: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
7780: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
7790: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
77a0: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
77b0: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
77c0: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
77d0: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
77e0: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
77f0: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
7800: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
7810: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
7820: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
7830: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
7840: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
7850: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
7860: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
7870: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
7880: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
7890: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
78a0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
78b0: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
78c0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
78d0: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
78e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
78f0: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
7900: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
7910: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
7920: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
7930: 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
7940: 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
7950: 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
7960: 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
7970: 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
7980: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
7990: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
79a0: 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
79b0: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
79c0: 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
79d0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
79e0: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
79f0: 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
7a00: 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
7a10: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
7a20: 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
7a30: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
7a40: 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
7a50: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
7a60: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
7a70: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
7a80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
7a90: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
7aa0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
7ab0: 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a 65 29 7b  useJournalSize){
7ac0: 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20  .  off_t szJ;   
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7ae0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
7af0: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
7b00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
7b30: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
7b40: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b60: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7b70: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
7b80: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
7b90: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
7ba0: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
7bb0: 61 67 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ages */.  unsign
7bc0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
7bd0: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
7be0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
7bf0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
7c00: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
7c10: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
7c20: 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
7c30: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  tine */.  int nM
7c40: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
7c50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7c60: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 61 6d  bytes in the nam
7c70: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
7c80: 6e 61 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  nal */.  char *z
7c90: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
7ca0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
7cb0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
7cc0: 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a   if any */..  /*
7cd0: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
7ce0: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
7cf0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
7d00: 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
7d10: 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
7d20: 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
7d30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7d40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
7d50: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  ;.  sqlite3OsSee
7d60: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
7d70: 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
7d80: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
7d90: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
7da0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7db0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
7dc0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
7dd0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
7de0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
7df0: 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 63 6f   too small to co
7e00: 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65  ntain a complete
7e10: 20 68 65 61 64 65 72 2c 0a 20 20 2a 2a 20 69 74   header,.  ** it
7e20: 20 6d 75 73 74 20 6d 65 61 6e 20 74 68 61 74 20   must mean that 
7e30: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
7e40: 20 63 72 65 61 74 65 64 20 74 68 65 20 6a 6f 75   created the jou
7e50: 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 0a 20 20  rnal was just.  
7e60: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 20  ** beginning to 
7e70: 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  write the journa
7e80: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 64  l file when it d
7e90: 69 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ied.  In that ca
7ea0: 73 65 2c 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  se,.  ** the dat
7eb0: 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
7ec0: 64 20 68 61 76 65 20 73 74 69 6c 6c 20 62 65 65  d have still bee
7ed0: 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 63  n completely unc
7ee0: 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 20 4e 6f 74  hanged..  ** Not
7ef0: 68 69 6e 67 20 6e 65 65 64 73 20 74 6f 20 62 65  hing needs to be
7f00: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 57   rolled back.  W
7f10: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 69 67 6e  e can safely ign
7f20: 6f 72 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ore this journal
7f30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 4a  ..  */.  if( szJ
7f40: 20 3c 20 32 34 20 29 7b 0a 20 20 20 20 67 6f 74   < 24 ){.    got
7f50: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
7f60: 20 20 7d 0a 0a 20 20 2f 2a 20 28 31 29 20 52 65    }..  /* (1) Re
7f70: 61 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ad the beginning
7f80: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7f90: 61 6e 64 20 76 65 72 69 66 79 20 74 68 65 20 6d  and verify the m
7fa0: 61 67 69 63 20 73 74 72 69 6e 67 0a 20 20 2a 2a  agic string.  **
7fb0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
7fc0: 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
7fd0: 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  . */.  rc = sqli
7fe0: 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
7ff0: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8000: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b  sizeof(aMagic));
8010: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8020: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
8030: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
8040: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
8050: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
8060: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
8070: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 28 32 29  k;.  }..  /* (2)
8080: 20 52 65 61 64 20 74 68 65 20 6e 75 6d 62 65 72   Read the number
8090: 20 6f 66 20 70 61 67 65 73 20 73 74 6f 72 65 64   of pages stored
80a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
80b0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
80c0: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
80d0: 6a 66 64 2c 20 28 75 33 32 2a 29 26 6e 52 65 63  jfd, (u32*)&nRec
80e0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
80f0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
8100: 0a 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66  .  if( nRec==0xf
8110: 66 66 66 66 66 66 66 20 7c 7c 20 75 73 65 4a 6f  fffffff || useJo
8120: 75 72 6e 61 6c 53 69 7a 65 20 7c 7c 20 0a 20 20  urnalSize || .  
8130: 20 20 20 20 6e 52 65 63 3e 28 73 7a 4a 20 2d 20      nRec>(szJ - 
8140: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8150: 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
8160: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 0a 20 20  PG_SZ(pPager).  
8170: 29 7b 0a 20 20 20 20 6e 52 65 63 20 3d 20 28 73  ){.    nRec = (s
8180: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
8190: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
81a0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
81b0: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 28 33  r);.  }..  /* (3
81c0: 29 20 52 65 61 64 20 74 68 65 20 69 6e 69 74 69  ) Read the initi
81d0: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
81e0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
81f0: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
8200: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
8210: 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  fd, &pPager->cks
8220: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
8230: 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61  c ) goto end_pla
8240: 79 62 61 63 6b 3b 0a 0a 20 20 2f 2a 20 28 34 29  yback;..  /* (4)
8250: 20 52 65 61 64 20 74 68 65 20 6e 75 6d 62 65 72   Read the number
8260: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
8270: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
8280: 72 69 6f 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  rior to the.  **
8290: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
82a0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72  ansaction */.  r
82b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
82c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6d 78  pPager->jfd, &mx
82d0: 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  Pg);.  if( rc!=S
82e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
82f0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
8300: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 28 35 29  k;.  }..  /* (5)
8310: 20 61 6e 64 20 28 36 29 3a 20 43 68 65 63 6b 20   and (6): Check 
8320: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
8330: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 70 65 63  nal file is spec
8340: 69 66 69 65 64 2e 20 49 66 20 6f 6e 65 20 69 73  ified. If one is
8350: 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2c  .  ** specified,
8360: 20 6f 6e 6c 79 20 70 72 6f 63 65 65 64 20 77 69   only proceed wi
8370: 74 68 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  th the playback 
8380: 69 66 20 69 74 20 73 74 69 6c 6c 20 65 78 69 73  if it still exis
8390: 74 73 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ts. */.  rc = re
83a0: 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72  ad32bits(&pPager
83b0: 2d 3e 6a 66 64 2c 20 26 6e 4d 61 73 74 65 72 29  ->jfd, &nMaster)
83c0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
83d0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
83e0: 20 20 69 66 28 20 73 7a 4a 20 3c 20 32 34 2b 6e    if( szJ < 24+n
83f0: 4d 61 73 74 65 72 20 29 20 67 6f 74 6f 20 65 6e  Master ) goto en
8400: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 69 66  d_playback;.  if
8410: 28 20 6e 4d 61 73 74 65 72 3e 30 20 29 7b 0a 20  ( nMaster>0 ){. 
8420: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
8430: 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  iteMalloc(nMaste
8440: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61  r);.    if( !zMa
8450: 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
8460: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
8470: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
8480: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
8490: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
84a0: 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
84b0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
84c0: 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  aster);.    if( 
84d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
84e0: 20 28 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20   (zMaster[0] && 
84f0: 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78  !sqlite3OsFileEx
8500: 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29  ists(zMaster)) )
8510: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
8520: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
8530: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 75 6e 63  .  }..  /* Trunc
8540: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
8550: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
8560: 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  's original size
8570: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
8580: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
8590: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f  ==0 || pPager->o
85a0: 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20  rigDbSize==mxPg 
85b0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
85c0: 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  3OsTruncate(&pPa
85d0: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
85e0: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
85f0: 29 6d 78 50 67 29 3b 0a 20 20 69 66 28 20 72 63  )mxPg);.  if( rc
8600: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8610: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
8620: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
8630: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
8640: 67 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  g;.  .  /* Copy 
8650: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
8660: 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
8670: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
8680: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8690: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
86a0: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
86b0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
86c0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
86d0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
86e0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
86f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8700: 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  K ){.      if( r
8710: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
8720: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
8730: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
8740: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8750: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
8760: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ages that have b
8770: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
8780: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e  he journal but n
8790: 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ever synced.  **
87a0: 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f   where not resto
87b0: 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20  red by the loop 
87c0: 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20  above.  We have 
87d0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65  to restore those
87e0: 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72  .  ** pages by r
87f0: 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b  eading them back
8800: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
8810: 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  al database..  *
8820: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
8830: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67  TE_OK ){.    pag
8840: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
8850: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 65 6e  pPager);.  }..en
8860: 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  d_playback:.  if
8870: 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( zMaster ){.   
8880: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
8890: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
88a0: 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
88b0: 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74  ne will return t
88c0: 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  rue,.    ** see 
88d0: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
88e0: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
88f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
8900: 49 66 20 65 72 72 6f 72 73 20 0a 20 20 20 20 2a  If errors .    *
8910: 2a 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74  * occur during t
8920: 68 69 73 20 70 72 6f 63 65 73 73 2c 20 69 67 6e  his process, ign
8930: 6f 72 65 20 74 68 65 6d 2e 0a 20 20 20 20 2a 2f  ore them..    */
8940: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8950: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8960: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
8970: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a  zMaster);.    }.
8980: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
8990: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69  Master);.  }.  i
89a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
89b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
89c0: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
89d0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
89e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
89f0: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
8a00: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8a10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
8a20: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
8a30: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
8a40: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
8a50: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
8a60: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
8a70: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
8a80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
8a90: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
8aa0: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
8ab0: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
8ac0: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
8ad0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
8ae0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
8af0: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
8b00: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
8b10: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
8b20: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
8b30: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
8b40: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
8b50: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
8b60: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
8b70: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
8b80: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
8b90: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
8ba0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
8bb0: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
8bc0: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
8bd0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
8be0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
8bf0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f  er *pPager){.  o
8c00: 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20 20  ff_t szJ;       
8c10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8c20: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
8c30: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  nal */.  int nRe
8c40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
8c50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
8c60: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
8c70: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8c80: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8c90: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
8ca0: 3b 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65  ;..  /* Truncate
8cb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
8cc0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
8cd0: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
8ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
8cf0: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
8d00: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
8d10: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61 67  SIZE*(off_t)pPag
8d20: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20  er->stmtSize);. 
8d30: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
8d40: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
8d50: 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  ze;..  /* Figure
8d60: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
8d70: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
8d80: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8d90: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
8da0: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  t( pPager->stmtI
8db0: 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e  nUse && pPager->
8dc0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
8dd0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
8de0: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
8df0: 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65  ;.  nRec = pPage
8e00: 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a  r->stmtNRec;.  .
8e10: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
8e20: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
8e30: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
8e40: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
8e50: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
8e60: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
8e70: 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
8e80: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69  ment journal omi
8e90: 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f  ts checksums fro
8ea0: 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f  m.  ** each reco
8eb0: 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66  rd since power-f
8ec0: 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20  ailure recovery 
8ed0: 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  is not important
8ee0: 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20   to statement.  
8ef0: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ** journals..  *
8f00: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
8f10: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
8f20: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
8f30: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
8f40: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
8f50: 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73  stfd, 0);.    as
8f60: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
8f70: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
8f80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8f90: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
8fa0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
8fb0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
8fc0: 77 20 6d 61 6e 79 20 70 61 67 65 73 20 6e 65 65  w many pages nee
8fd0: 64 20 74 6f 20 62 65 20 63 6f 70 69 65 64 20 6f  d to be copied o
8fe0: 75 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  ut of the transa
8ff0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ction.  ** journ
9000: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  al..  */.  rc = 
9010: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
9020: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
9030: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
9040: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9050: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
9060: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
9070: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  k;.  }.  rc = sq
9080: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
9090: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  &pPager->jfd, &s
90a0: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
90b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
90c0: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
90d0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52  ayback;.  }.  nR
90e0: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
90f0: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 2f 4a  er->stmtJSize)/J
9100: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
9110: 67 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 52  ger);.  for(i=nR
9120: 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ec-1; i>=0; i--)
9130: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
9140: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
9150: 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
9160: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
9170: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9180: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
9190: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
91a0: 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ONE );.      got
91b0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
91c0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ack;.    }.  }. 
91d0: 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
91e0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
91f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9200: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
9210: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  |= PAGER_ERR_COR
9220: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
9230: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
9240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9250: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
9260: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
9270: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
9280: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
9290: 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  llowed..**.** Th
92a0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
92b0: 20 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65   is the absolute
92c0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 78   value of the mx
92d0: 50 61 67 65 20 70 61 72 61 6d 65 74 65 72 2e 0a  Page parameter..
92e0: 2a 2a 20 49 66 20 6d 78 50 61 67 65 20 69 73 20  ** If mxPage is 
92f0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 6e 6f  negative, the no
9300: 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73  Sync flag is als
9310: 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62  o set.  noSync b
9320: 79 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73  ypasses.** calls
9330: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 53 79 6e   to sqlite3OsSyn
9340: 63 28 29 2e 20 20 54 68 65 20 70 61 67 65 72 20  c().  The pager 
9350: 72 75 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72  runs much faster
9360: 20 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c   with noSync on,
9370: 0a 2a 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f  .** but if the o
9380: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
9390: 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
93a0: 20 69 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f   is an abrupt po
93b0: 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c  wer .** failure,
93c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
93d0: 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  le might be left
93e0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
93f0: 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70  ent and.** unrep
9400: 61 69 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20  airable state.  
9410: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9420: 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73  pager_set_caches
9430: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
9440: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
9450: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20    if( mxPage>=0 
9460: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
9470: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
9480: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 69 66  tempFile;.    if
9490: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
94a0: 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
94b0: 79 6e 63 20 3d 20 30 3b 20 0a 20 20 7d 65 6c 73  ync = 0; .  }els
94c0: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  e{.    pPager->n
94d0: 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d  oSync = 1;.    m
94e0: 78 50 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b  xPage = -mxPage;
94f0: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67  .  }.  if( mxPag
9500: 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
9510: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
9520: 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
9530: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
9540: 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = 10;.  }.}../*
9550: 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72  .** Adjust the r
9560: 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65  obustness of the
9570: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
9580: 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
9590: 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65  ashes.** or powe
95a0: 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68  r failures by ch
95b0: 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
95c0: 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
95d0: 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  en writing.** th
95e0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
95f0: 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74  al.  There are t
9600: 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
9610: 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
9620: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
9630: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
9640: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
9650: 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
9660: 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
9670: 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
9680: 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
9690: 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
96a0: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
96b0: 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
96c0: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
96d0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
96e0: 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
96f0: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
9700: 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
9710: 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
9720: 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
9730: 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
9740: 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
9750: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
9760: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
9770: 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
9780: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
9790: 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
97a0: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
97b0: 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
97c0: 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
97d0: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
97e0: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
97f0: 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
9800: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
9810: 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
9820: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
9830: 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
9840: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
9850: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
9860: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
9870: 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
9880: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
9890: 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
98a0: 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
98b0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
98c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
98d0: 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
98e0: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
98f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
9900: 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
9910: 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
9920: 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
9930: 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
9940: 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
9950: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
9960: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
9970: 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
9980: 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
9990: 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
99a0: 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
99b0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
99c0: 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
99d0: 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
99e0: 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
99f0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
9a00: 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
9a10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
9a20: 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
9a30: 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
9a40: 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
9a50: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9a60: 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74  3pager_set_safet
9a70: 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  y_level(Pager *p
9a80: 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
9a90: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
9aa0: 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20  ync =  level==1 
9ab0: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
9ac0: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
9ad0: 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  ullSync = level=
9ae0: 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
9af0: 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  empFile;.  if( p
9b00: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
9b10: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
9b20: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f   = 0;.}../*.** O
9b30: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
9b40: 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
9b50: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
9b60: 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20  e into zName.** 
9b70: 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61  (zName must be a
9b80: 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54  t least SQLITE_T
9b90: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74  EMPNAME_SIZE byt
9ba0: 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65  es long.)  Write
9bb0: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
9bc0: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
9bd0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
9be0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
9bf0: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
9c00: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
9c10: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   fail..**.** The
9c20: 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
9c30: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
9c40: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
9c50: 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63   when it is.** c
9c60: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
9c70: 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65   int sqlite3page
9c80: 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20  r_opentemp(char 
9c90: 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a  *zFile, OsFile *
9ca0: 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  fd){.  int cnt =
9cb0: 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   8;.  int rc;.  
9cc0: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
9cd0: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
9ce0: 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b  FileName(zFile);
9cf0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9d00: 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
9d10: 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a  (zFile, fd, 1);.
9d20: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
9d30: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
9d40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
9d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
9d60: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
9d70: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
9d80: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
9d90: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
9da0: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
9db0: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
9dc0: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
9dd0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
9de0: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
9df0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
9e00: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
9e10: 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
9e20: 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
9e30: 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
9e40: 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
9e50: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
9e60: 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
9e70: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
9e80: 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
9e90: 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
9ea0: 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
9eb0: 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
9ec0: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
9ed0: 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
9ee0: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
9ef0: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
9f00: 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
9f10: 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
9f20: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a  ite3pager_open(.
9f30: 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
9f40: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
9f50: 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
9f60: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
9f70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9f80: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
9f90: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
9fa0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
9fb0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
9fc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9fd0: 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66 20  * Max number of 
9fe0: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
9ff0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  pages */.  int n
a000: 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
a010: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
a020: 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
a030: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
a040: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
a050: 72 6e 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  rnal,          /
a060: 2a 20 54 52 55 45 20 74 6f 20 75 73 65 20 61 20  * TRUE to use a 
a070: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
a080: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
a090: 0a 20 20 76 6f 69 64 20 20 2a 70 42 75 73 79 48  .  void  *pBusyH
a0a0: 61 6e 64 6c 65 72 20 20 20 20 20 20 2f 2a 20 42  andler      /* B
a0b0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  usy callback */.
a0c0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
a0d0: 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  er;.  char *zFul
a0e0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20  lPathname = 0;. 
a0f0: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20   int nameLen;.  
a100: 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74  OsFile fd;.  int
a110: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a120: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
a130: 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
a140: 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
a150: 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
a160: 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  0;.  char zTemp[
a170: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
a180: 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67  SIZE];..  *ppPag
a190: 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  er = 0;.  memset
a1a0: 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&fd, 0, sizeof(
a1b0: 66 64 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  fd));.  if( sqli
a1c0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
a1d0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
a1e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a1f0: 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  }.  if( zFilenam
a200: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
a210: 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ] ){.    if( str
a220: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
a230: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
a240: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
a250: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
a260: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
a270: 44 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20 72  Dup("");.      r
a280: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a2a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
a2b0: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
a2c0: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
a2d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  ;.      if( zFul
a2e0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
a2f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a300: 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
a310: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
a320: 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b  &fd, &readOnly);
a330: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
a350: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
a360: 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66  entemp(zTemp, &f
a370: 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  d);.    zFilenam
a380: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
a390: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
a3a0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
a3b0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
a3c0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
a3d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a3e0: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
a3f0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a    }.  }.  if( !z
a400: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
a410: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a420: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
a430: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a440: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
a450: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
a460: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
a470: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
a480: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a490: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
a4a0: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
a4b0: 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  ;.  pPager = sql
a4c0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
a4d0: 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d  f(*pPager) + nam
a4e0: 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20  eLen*3 + 30 );. 
a4f0: 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29   if( pPager==0 )
a500: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
a510: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73  lose(&fd);.    s
a520: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
a530: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
a540: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
a550: 4d 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 50 41 47  M;.  }.  SET_PAG
a560: 45 52 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ER(pPager);.  pP
a570: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
a580: 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72  = (char*)&pPager
a590: 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  [1];.  pPager->z
a5a0: 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61  Directory = &pPa
a5b0: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
a5c0: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61  ameLen+1];.  pPa
a5d0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
a5e0: 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  &pPager->zDirect
a5f0: 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ory[nameLen+1];.
a600: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
a610: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c  >zFilename, zFul
a620: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74  lPathname);.  st
a630: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  rcpy(pPager->zDi
a640: 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61  rectory, zFullPa
a650: 74 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  thname);.  for(i
a660: 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26  =nameLen; i>0 &&
a670: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
a680: 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69  ory[i-1]!='/'; i
a690: 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20  --){}.  if( i>0 
a6a0: 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  ) pPager->zDirec
a6b0: 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20  tory[i-1] = 0;. 
a6c0: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
a6d0: 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50  zJournal, zFullP
a6e0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  athname);.  sqli
a6f0: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
a700: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
a710: 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
a720: 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f  l[nameLen], "-jo
a730: 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65  urnal");.  pPage
a740: 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 50  r->fd = fd;.  pP
a750: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
a760: 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  n = 0;.  pPager-
a770: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
a780: 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
a790: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  Db;.  pPager->st
a7a0: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50  mtOpen = 0;.  pP
a7b0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
a7c0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
a7d0: 52 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Ref = 0;.  pPage
a7e0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44  r->dbSize = memD
a7f0: 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  b-1;.  pPager->p
a800: 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  ageSize = SQLITE
a810: 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50  _PAGE_SIZE;.  pP
a820: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
a830: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
a840: 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  mtJSize = 0;.  p
a850: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
a860: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ;.  pPager->mxPa
a870: 67 65 20 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20  ge = mxPage>5 ? 
a880: 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a 20 20 70  mxPage : 10;.  p
a890: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
a8a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70  AGER_UNLOCK;.  p
a8b0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
a8c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   0;.  pPager->te
a8d0: 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
a8e0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
a8f0: 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
a900: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
a910: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61   readOnly;.  pPa
a920: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
a930: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  0;.  pPager->noS
a940: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
a950: 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
a960: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
a970: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
a980: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
a990: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
a9a0: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
a9b0: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
a9c0: 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65   nExtra;.  pPage
a9d0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
a9e0: 3d 20 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  = (BusyHandler *
a9f0: 29 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  )pBusyHandler;. 
aa00: 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
aa10: 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
aa20: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
aa30: 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ;.  *ppPager = p
aa40: 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
aa50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
aa60: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
aa70: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
aa80: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
aa90: 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
aaa0: 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
aab0: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
aac0: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
aad0: 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
aae0: 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
aaf0: 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
ab00: 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
ab10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
ab20: 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
ab30: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
ab40: 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
ab50: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
ab60: 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
ab70: 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70 61  result sqlite3pa
ab80: 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a  ger_close().  .*
ab90: 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
aba0: 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
abb0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
abc0: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
abd0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
abe0: 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  destructor(Pager
abf0: 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
ac00: 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e  *xDesc)(void*,in
ac10: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
ac20: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
ac30: 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
ac40: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
ac50: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
ac60: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
ac70: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
ac80: 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
ac90: 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
aca0: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
acb0: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
acc0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
acd0: 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
ace0: 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
acf0: 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
ad00: 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
ad10: 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
ad20: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
ad30: 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
ad40: 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
ad50: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
ad60: 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
ad70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ad80: 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69  3pager_set_reini
ad90: 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
ada0: 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
adb0: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  t)(void*,int)){.
adc0: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
add0: 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
ade0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
adf0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
ae00: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
ae10: 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
ae20: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
ae30: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
ae40: 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
ae50: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
ae60: 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20 20  ){.  off_t n;.  
ae70: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
ae80: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
ae90: 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
aea0: 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
aeb0: 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20  r->dbSize;.  }. 
aec0: 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
aed0: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
aee0: 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f  fd, &n)!=SQLITE_
aef0: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
af00: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
af10: 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20  ER_ERR_DISK;.   
af20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
af30: 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41 47   n /= SQLITE_PAG
af40: 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 21 70  E_SIZE;.  if( !p
af50: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20  Pager->memDb && 
af60: 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  n==PENDING_BYTE/
af70: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
af80: 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d   ){.    n++;.  }
af90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
afa0: 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
afb0: 43 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  CK ){.    pPager
afc0: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20  ->dbSize = n;.  
afd0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
afe0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
aff0: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
b000: 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
b010: 72 6e 61 6c 28 50 61 67 65 72 2a 2c 20 63 6f 6e  rnal(Pager*, con
b020: 73 74 20 63 68 61 72 2a 29 3b 0a 0a 0a 2f 2a 0a  st char*);.../*.
b030: 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65  ** Unlink a page
b040: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
b050: 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
b060: 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65   all pages where
b070: 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64   nRef==0).** and
b080: 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
b090: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a  ollision chain..
b0a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
b0b0: 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20  nlinkPage(PgHdr 
b0c0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
b0d0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
b0e0: 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70  ager;..  /* Keep
b0f0: 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65   the pFirstSynce
b100: 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  d pointer pointi
b110: 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20  ng at the first 
b120: 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67  synchronized pag
b130: 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d  e */.  if( pPg==
b140: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
b150: 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64  nced ){.    PgHd
b160: 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
b170: 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65  tFree;.    while
b180: 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
b190: 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
b1a0: 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50  xtFree; }.    pP
b1b0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
b1c0: 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = p;.  }..  /
b1d0: 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
b1e0: 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
b1f0: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
b200: 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
b210: 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
b220: 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
b230: 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
b240: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
b250: 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29  r->pFirst==pPg )
b260: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  ;.    pPager->pF
b270: 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
b280: 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28  tFree;.  }.  if(
b290: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
b2a0: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
b2b0: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
b2c0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
b2d0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
b2e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b2f0: 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pLast==pPg );.  
b300: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
b310: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
b320: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
b330: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  xtFree = pPg->pP
b340: 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20  revFree = 0;..  
b350: 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
b360: 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62  he pgno hash tab
b370: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  le */.  if( pPg-
b380: 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
b390: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
b3a0: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
b3b0: 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
b3c0: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  }.  if( pPg->pPr
b3d0: 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50  evHash ){.    pP
b3e0: 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
b3f0: 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
b400: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73  NextHash;.  }els
b410: 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70  e{.    int h = p
b420: 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70  ager_hash(pPg->p
b430: 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
b440: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
b450: 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  h]==pPg );.    p
b460: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
b470: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
b480: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
b490: 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
b4a0: 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a  revHash = 0;.}..
b4b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b4c0: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72  ne is used to tr
b4d0: 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  uncate an in-mem
b4e0: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 44  ory database.  D
b4f0: 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67  elete.** all pag
b500: 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73  es whose pgno is
b510: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
b520: 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20  ger->dbSize and 
b530: 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e  is unreferenced.
b540: 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70  .** Referenced p
b550: 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  ages larger than
b560: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
b570: 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73  are zeroed..*/.s
b580: 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72  tatic void memor
b590: 79 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  yTruncate(Pager 
b5a0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
b5b0: 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20  r *pPg;.  PgHdr 
b5c0: 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62  **ppPg;.  int db
b5d0: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
b5e0: 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d  bSize;..  ppPg =
b5f0: 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a   &pPager->pAll;.
b600: 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20    while( (pPg = 
b610: 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20  *ppPg)!=0 ){.   
b620: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
b630: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
b640: 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
b650: 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
b660: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30   if( pPg->nRef>0
b670: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
b680: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
b690: 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
b6a0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
b6b0: 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
b6c0: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
b6d0: 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d  e{.      *ppPg =
b6e0: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
b6f0: 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
b700: 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pPg);.      sql
b710: 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
b720: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
b730: 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  e--;.    }.  }.}
b740: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
b750: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65   the file to the
b760: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
b770: 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69   specified..*/.i
b780: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
b790: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
b7a0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
b7b0: 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge){.  int rc;. 
b7c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
b7d0: 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ize<0 ){.    sql
b7e0: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
b7f0: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  unt(pPager);.  }
b800: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
b810: 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
b820: 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
b830: 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
b840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
b850: 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
b860: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
b870: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
b880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
b890: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
b8a0: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50  >memDb ){.    pP
b8b0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
b8c0: 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Page;.    memory
b8d0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
b8e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
b8f0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
b900: 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
b910: 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28  Pager, 0);.  if(
b920: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b930: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
b940: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
b950: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70  te3OsTruncate(&p
b960: 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
b970: 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66  E_PAGE_SIZE*(off
b980: 5f 74 29 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  _t)nPage);.  if(
b990: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b9a0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
b9b0: 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
b9c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b9d0: 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
b9e0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
b9f0: 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
ba00: 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
ba10: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
ba20: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
ba30: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
ba40: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
ba50: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
ba60: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
ba70: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
ba80: 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
ba90: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
baa0: 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
bab0: 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
bac0: 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
bad0: 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
bae0: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
baf0: 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
bb00: 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
bb10: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
bb20: 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
bb30: 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
bb40: 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
bb50: 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67  3pager_close(Pag
bb60: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
bb70: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
bb80: 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50 61  t;.  switch( pPa
bb90: 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20  ger->state ){.  
bba0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53    case PAGER_RES
bbb0: 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20  ERVED:.    case 
bbc0: 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20  PAGER_SYNCED: . 
bbd0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58     case PAGER_EX
bbe0: 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20  CLUSIVE: {.     
bbf0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
bc00: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
bc10: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
bc20: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
bc30: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
bc40: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
bc50: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
bc60: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
bc70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bc80: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Open==0 );.     
bc90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bca0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41    case PAGER_SHA
bcb0: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  RED: {.      if(
bcc0: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
bcd0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
bce0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
bcf0: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
bd00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bd10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
bd20: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
bd30: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
bd40: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
bd50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
bd60: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
bd70: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
bd80: 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ){.#ifndef NDEBU
bd90: 47 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  G.    if( pPager
bda0: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
bdb0: 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
bdc0: 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
bdd0: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
bde0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
bdf0: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
be00: 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
be10: 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
be20: 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
be30: 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
be40: 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
be50: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
be60: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
be70: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
be80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
be90: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66  Close(&pPager->f
bea0: 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  d);.  assert( pP
beb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
bec0: 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d  n==0 );.  /* Tem
bed0: 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
bee0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
bef0: 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
bf00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
bf10: 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
bf20: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
bf30: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
bf40: 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
bf50: 20 20 43 4c 52 5f 50 41 47 45 52 28 70 50 61 67    CLR_PAGER(pPag
bf60: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
bf70: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d 28 63  r->zFilename!=(c
bf80: 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 20  har*)&pPager[1] 
bf90: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  ){.    assert( 0
bfa0: 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
bfb0: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c  appen */.    sql
bfc0: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
bfd0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
bfe0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
bff0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
c000: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
c010: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29  ger->zDirectory)
c020: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
c030: 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
c040: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c050: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c060: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
c070: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
c080: 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f  ge data..*/.Pgno
c090: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
c0a0: 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70  genumber(void *p
c0b0: 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
c0c0: 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  p = DATA_TO_PGHD
c0d0: 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
c0e0: 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  rn p->pgno;.}../
c0f0: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65  *.** The page_re
c100: 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63  f() function inc
c110: 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65  rements the refe
c120: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
c130: 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68  a page..** If th
c140: 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
c150: 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
c160: 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e  ist (the referen
c170: 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
c180: 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65  ) then.** remove
c190: 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65   it from the fre
c1a0: 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  elist..**.** For
c1b0: 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d   non-test system
c1c0: 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73  s, page_ref() is
c1d0: 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61   a macro that ca
c1e0: 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a  lls _page_ref().
c1f0: 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65  ** online of the
c200: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
c210: 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74   is zero.  For t
c220: 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
c230: 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20  e_ref().** is a 
c240: 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f  real function so
c250: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74   that we can set
c260: 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64   breakpoints and
c270: 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74   trace it..*/.st
c280: 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f  atic void _page_
c290: 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
c2a0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
c2b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
c2c0: 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
c2d0: 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
c2e0: 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e  ist.  Remove it.
c2f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d   */.    if( pPg=
c300: 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46  =pPg->pPager->pF
c310: 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
c320: 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
c330: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
c340: 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26       while( p &&
c350: 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20   p->needSync ){ 
c360: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65  p = p->pNextFree
c370: 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  ; }.      pPg->p
c380: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
c390: 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ced = p;.    }. 
c3a0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
c3b0: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
c3c0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
c3d0: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
c3e0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d  pNextFree;.    }
c3f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
c400: 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  >pPager->pFirst 
c410: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
c420: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c430: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
c440: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  {.      pPg->pNe
c450: 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
c460: 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
c470: 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ee;.    }else{. 
c480: 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
c490: 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
c4a0: 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a  PrevFree;.    }.
c4b0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
c4c0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
c4d0: 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45  Pg->nRef++;.  RE
c4e0: 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69  FINFO(pPg);.}.#i
c4f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
c500: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
c510: 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
c520: 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
c530: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
c540: 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
c550: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c560: 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
c570: 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70  .      REFINFO(p
c580: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Pg);.    }.  }.#
c590: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
c5a0: 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
c5b0: 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
c5c0: 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
c5d0: 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
c5e0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
c5f0: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
c600: 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
c610: 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
c620: 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
c630: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
c640: 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
c650: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
c660: 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
c670: 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
c680: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
c690: 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  a);.  page_ref(p
c6a0: 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
c6b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c6c0: 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
c6d0: 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
c6e0: 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
c6f0: 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
c700: 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
c710: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
c720: 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
c730: 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
c740: 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
c750: 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
c760: 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
c770: 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
c780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
c790: 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
c7a0: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
c7b0: 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
c7c0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
c7d0: 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
c7e0: 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
c7f0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
c800: 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
c810: 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
c820: 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
c830: 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
c840: 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
c850: 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
c860: 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
c870: 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
c880: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
c890: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
c8a0: 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
c8b0: 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
c8c0: 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
c8d0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
c8e0: 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
c8f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
c900: 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
c910: 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
c920: 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
c930: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
c940: 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
c950: 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
c960: 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
c970: 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
c980: 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
c990: 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
c9a0: 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
c9b0: 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
c9c0: 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
c9d0: 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
c9e0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
c9f0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
ca00: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
ca10: 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
ca20: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
ca30: 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
ca40: 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
ca50: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
ca60: 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
ca70: 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
ca80: 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
ca90: 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
caa0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
cab0: 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
cac0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
cad0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
cae0: 61 73 74 65 72 29 7b 0a 20 20 50 67 48 64 72 20  aster){.  PgHdr 
caf0: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
cb00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
cb10: 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
cb20: 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
cb30: 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
cb40: 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
cb50: 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
cb60: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
cb70: 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
cb80: 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
cb90: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
cba0: 7c 7c 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  || zMaster ){.  
cbb0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
cbc0: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
cbd0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
cbe0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
cbf0: 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
cc00: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
cc10: 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
cc20: 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
cc30: 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
cc40: 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
cc50: 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
cc60: 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
cc70: 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
cc80: 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
cc90: 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
cca0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
ccb0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
ccc0: 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
ccd0: 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
cce0: 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
ccf0: 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
cd00: 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
cd10: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
cd20: 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
cd30: 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 68 64          off_t hd
cd40: 72 53 7a 2c 20 70 67 53 7a 2c 20 6a 53 7a 3b 0a  rSz, pgSz, jSz;.
cd50: 20 20 20 20 20 20 20 20 68 64 72 53 7a 20 3d 20          hdrSz = 
cd60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
cd70: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
cd80: 70 67 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50  pgSz = JOURNAL_P
cd90: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
cda0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cdb0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
cdc0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29  ager->jfd, &jSz)
cdd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
cde0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
cdf0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ce00: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a 70 67   pPager->nRec*pg
ce10: 53 7a 2b 68 64 72 53 7a 3d 3d 6a 53 7a 20 29 3b  Sz+hdrSz==jSz );
ce20: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
ce30: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
ce40: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
ce50: 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
ce60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
ce70: 61 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ader */.        
ce80: 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20 20 20 20 20  off_t szJ;.     
ce90: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
cea0: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
ceb0: 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e       TRACE2("SYN
cec0: 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
ced0: 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
cee0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
cef0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
cf00: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
cf10: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
cf20: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
cf30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cf40: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
cf50: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69  &pPager->jfd, si
cf60: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
cf70: 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ic));.        rc
cf80: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
cf90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
cfa0: 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20  ger->nRec);.    
cfb0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
cfc0: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  urn rc;..       
cfd0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
cfe0: 6d 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  me of the master
cff0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
d000: 20 6f 6e 65 20 69 73 20 73 70 65 63 69 66 69 65   one is specifie
d010: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  d */.        if(
d020: 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   zMaster ){.    
d030: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 74        assert( st
d040: 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3c 70 50  rlen(zMaster)<pP
d050: 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20 29 3b  ager->nMaster );
d060: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
d070: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
d080: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 32 30 29 3b  Pager->jfd, 20);
d090: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
d0a0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d0b0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
d0c0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
d0d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
d0e0: 65 72 2c 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  er, strlen(zMast
d0f0: 65 72 29 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  er)+1);.        
d100: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
d110: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
d120: 0a 20 20 20 20 20 20 20 20 73 7a 4a 20 3d 20 4a  .        szJ = J
d130: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d140: 61 67 65 72 29 20 2b 20 20 70 50 61 67 65 72 2d  ager) +  pPager-
d150: 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47  >nRec*JOURNAL_PG
d160: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
d170: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
d180: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
d190: 20 73 7a 4a 29 3b 0a 20 20 20 20 20 20 7d 0a 20   szJ);.      }. 
d1a0: 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e       TRACE2("SYN
d1b0: 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
d1c0: 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
d1d0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
d1e0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61  lite3OsSync(&pPa
d1f0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
d200: 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
d210: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50  urn rc;.      pP
d220: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
d230: 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rted = 1;.    }.
d240: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
d250: 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Sync = 0;..    /
d260: 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64  * Erase the need
d270: 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65  Sync flag from e
d280: 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a  very page..    *
d290: 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  /.    for(pPg=pP
d2a0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
d2b0: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
d2c0: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
d2d0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
d2e0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
d2f0: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
d300: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
d310: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   }..#ifndef NDEB
d320: 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50  UG.  /* If the P
d330: 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
d340: 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
d350: 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
d360: 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75  ync.  ** flag mu
d370: 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72  st also be clear
d380: 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20   for all pages. 
d390: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69   Verify that thi
d3a0: 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74  s.  ** invariant
d3b0: 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   is true..  */. 
d3c0: 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70   else{.    for(p
d3d0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
d3e0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
d3f0: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
d400: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
d410: 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
d420: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
d430: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
d440: 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  ed==pPager->pFir
d450: 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  st );.  }.#endif
d460: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
d470: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
d480: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63  list of pages (c
d490: 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20  onnected by the 
d4a0: 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
d4b0: 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65  nter) write.** e
d4c0: 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73  very one of thos
d4d0: 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74  e pages out to t
d4e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d4f0: 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61   and mark them a
d500: 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a  ll.** as clean..
d510: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
d520: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
d530: 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29  st(PgHdr *pList)
d540: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
d550: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  r;.  int rc;.  i
d560: 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 0a 20 20  nt busy = 1;..  
d570: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
d580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d590: 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73  .  pPager = pLis
d5a0: 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  t->pPager;..  /*
d5b0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
d5c0: 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68  here may be eith
d5d0: 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  er a RESERVED or
d5e0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
d5f0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
d600: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
d610: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
d620: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
d630: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
d640: 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
d650: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72  lite3OsLock() ar
d660: 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20  e no-ops..  **. 
d670: 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
d680: 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
d690: 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
d6a0: 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
d6b0: 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
d6c0: 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
d6d0: 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
d6e0: 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
d6f0: 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
d700: 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
d710: 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
d720: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
d730: 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
d740: 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
d750: 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
d760: 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
d770: 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
d780: 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
d790: 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
d7a0: 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
d7b0: 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
d7c0: 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
d7d0: 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
d7e0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
d7f0: 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
d800: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
d810: 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
d820: 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
d830: 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
d840: 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
d850: 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
d860: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
d870: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
d880: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d890: 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
d8a0: 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
d8b0: 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
d8c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d8d0: 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
d8e0: 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
d8f0: 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
d900: 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
d910: 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
d920: 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 73   do {.    rc = s
d930: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
d940: 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
d950: 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 77 68  IVE_LOCK);.  }wh
d960: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
d970: 42 55 53 59 20 26 26 20 0a 20 20 20 20 20 20 70  BUSY && .      p
d980: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
d990: 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20 70 50  ler && .      pP
d9a0: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
d9b0: 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20  er->xFunc && .  
d9c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
d9d0: 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28  yHandler->xFunc(
d9e0: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
d9f0: 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79  dler->pArg, busy
da00: 2b 2b 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ++).  );.  if( r
da10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
da20: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
da30: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61   }.  pPager->sta
da40: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
da50: 53 49 56 45 3b 0a 0a 20 20 77 68 69 6c 65 28 20  SIVE;..  while( 
da60: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
da70: 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
da80: 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  y );.    sqlite3
da90: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
daa0: 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
dab0: 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54  -1)*(off_t)SQLIT
dac0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
dad0: 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
dae0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
daf0: 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
db00: 6f 2c 20 36 29 3b 0a 20 20 20 20 54 52 41 43 45  o, 6);.    TRACE
db10: 32 28 22 53 54 4f 52 45 20 70 61 67 65 20 25 64  2("STORE page %d
db20: 5c 6e 22 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  \n", pList->pgno
db30: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
db40: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
db50: 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
db60: 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 53 51  _DATA(pList), SQ
db70: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
db80: 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65  .    CODEC(pPage
db90: 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
dba0: 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
dbb0: 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66  pgno, 0);.    if
dbc0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
dbd0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72  ;.    pList->dir
dbe0: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73  ty = 0;.    pLis
dbf0: 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
dc00: 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
dc10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
dc20: 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
dc30: 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
dc40: 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
dc50: 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
dc60: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
dc70: 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
dc80: 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
dc90: 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
dca0: 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
dcb0: 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
dcc0: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
dcd0: 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
dce0: 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
dcf0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
dd00: 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69  p, *pList;.  pLi
dd10: 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  st = 0;.  for(p=
dd20: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
dd30: 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
dd40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74  .    if( p->dirt
dd50: 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44  y ){.      p->pD
dd60: 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20  irty = pList;.  
dd70: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20      pList = p;. 
dd80: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
dd90: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
dda0: 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
ddb0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
ddc0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
ddd0: 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
dde0: 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
ddf0: 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
de00: 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
de10: 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
de20: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
de30: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
de40: 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72  **.** A _get wor
de50: 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ks for any page 
de60: 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
de70: 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64  han 0.  If the d
de80: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
de90: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
dea0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
deb0: 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75  ge, then no actu
dec0: 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  al disk.** read 
ded0: 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d  occurs and the m
dee0: 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
def0: 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  he page is initi
df00: 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c  alized to.** all
df10: 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74   zeros.  The ext
df20: 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
df30: 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
df40: 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
df50: 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  .** to zeros the
df60: 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
df70: 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
df80: 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  o memory..**.** 
df90: 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
dfa0: 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
dfb0: 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
dfc0: 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
dfd0: 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
dfe0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
dff0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
e000: 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
e010: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
e020: 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  so sqlite3pager_
e030: 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  lookup().  Both 
e040: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
e050: 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d   _lookup() attem
e060: 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
e070: 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
e080: 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
e090: 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
e0a0: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
e0b0: 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
e0c0: 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
e0d0: 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
e0e0: 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f  t in whereas _lo
e0f0: 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
e100: 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
e110: 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
e120: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
e130: 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
e140: 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
e150: 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
e160: 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
e170: 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
e180: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
e190: 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76  ce _lookup() nev
e1a0: 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
e1b0: 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
e1c0: 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
e1d0: 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
e1e0: 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
e1f0: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 50 61  ite3pager_get(Pa
e200: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
e210: 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70  o pgno, void **p
e220: 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  pPage){.  PgHdr 
e230: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
e240: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
e250: 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
e260: 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
e270: 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
e280: 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
e290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
e2a0: 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
e2b0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
e2c0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
e2d0: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
e2e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
e2f0: 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
e300: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
e310: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
e320: 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
e330: 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
e340: 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
e350: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
e360: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
e370: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
e380: 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  && !pPager->memD
e390: 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 75 73  b ){.    int bus
e3a0: 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f 20 7b 0a  y = 1;.    do {.
e3b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e3c0: 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
e3d0: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
e3e0: 4b 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  K);.    }while( 
e3f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
e400: 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
e410: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
e420: 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
e430: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
e440: 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20  r->xFunc && .   
e450: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
e460: 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63  syHandler->xFunc
e470: 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
e480: 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73  ndler->pArg, bus
e490: 79 2b 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  y++).    );.    
e4a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e4b0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
e4c0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
e4d0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e4e0: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20  PAGER_SHARED;.. 
e4f0: 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
e500: 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
e510: 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
e520: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
e530: 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
e540: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
e550: 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
e560: 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
e570: 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
e580: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
e590: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
e5a0: 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  && .        sqli
e5b0: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
e5c0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e5d0: 29 20 26 26 0a 20 20 20 20 20 20 20 20 21 73 71  ) &&.        !sq
e5e0: 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
e5f0: 72 76 65 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  rvedLock(&pPager
e600: 2d 3e 66 64 29 20 0a 20 20 20 20 29 7b 0a 20 20  ->fd) .    ){.  
e610: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20       int rc;..  
e620: 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
e630: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
e640: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e650: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 72 63  le. */.       rc
e660: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
e670: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  (&pPager->fd, EX
e680: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
e690: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
e6a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e6b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
e6c0: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
e6d0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
e6e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
e6f0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
e700: 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
e710: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20  n rc;.       }. 
e720: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
e730: 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
e740: 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f  USIVE;..       /
e750: 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
e760: 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  al for reading o
e770: 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  nly.  Return SQL
e780: 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20  ITE_BUSY if.    
e790: 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61     ** we are una
e7a0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
e7b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20  journal file. . 
e7c0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
e7d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
e7e0: 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ile does not nee
e7f0: 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69  d to be locked i
e800: 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20  tself.  The.    
e810: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
e820: 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e  le is never open
e830: 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e   unless the main
e840: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
e850: 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61  olds.       ** a
e860: 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20   write lock, so 
e870: 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
e880: 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f  ny chance of two
e890: 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20   or more.       
e8a0: 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65  ** processes ope
e8b0: 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ning the journal
e8c0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
e8d0: 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e..       */.   
e8e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e8f0: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70  OsOpenReadOnly(p
e900: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
e910: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a   &pPager->jfd);.
e920: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
e930: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e940: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
e950: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
e960: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
e970: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
e980: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
e990: 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  K;.         retu
e9a0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
e9b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e9c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e9d0: 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  pen = 1;.       
e9e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
e9f0: 74 61 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20  tarted = 0;..   
ea00: 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
ea10: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
ea20: 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
ea30: 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
ea40: 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  .       ** lock 
ea50: 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
ea60: 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
ea70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
ea80: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
ea90: 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
eaa0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
eab0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
eac0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ead0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
eae0: 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
eaf0: 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
eb00: 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63   for page in cac
eb10: 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  he */.    pPg = 
eb20: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
eb30: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
eb40: 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
eb50: 62 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  b && pPager->sta
eb60: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
eb70: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
eb80: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
eb90: 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
eba0: 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  }.  if( pPg==0 )
ebb0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
ebc0: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
ebd0: 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  ot in the page c
ebe0: 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ache. */.    int
ebf0: 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   h;.    pPager->
ec00: 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28  nMiss++;.    if(
ec10: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
ec20: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
ec30: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
ec40: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65  =0 || pPager->me
ec50: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  mDb ){.      /* 
ec60: 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
ec70: 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d  e */.      pPg =
ec80: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
ec90: 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  ( sizeof(*pPg) +
eca0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
ecb0: 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E .             
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
ece0: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a   pPager->nExtra.
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
ed10: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 2a 73 69  pPager->memDb*si
ed20: 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
ed30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
ed40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
ed50: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
ed60: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  b ){.          p
ed70: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
ed80: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
ed90: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
eda0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
edb0: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20  AGER_ERR_MEM;.  
edc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
edd0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
ede0: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
edf0: 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pPg, 0, sizeof(*
ee00: 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28  pPg));.      if(
ee10: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
ee20: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
ee30: 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
ee40: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
ee50: 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
ee60: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
ee70: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
ee80: 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50  pPager;.      pP
ee90: 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
eea0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
eeb0: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
eec0: 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67   pPg;.      pPag
eed0: 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  er->nPage++;.   
eee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
eef0: 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   Find a page to 
ef00: 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f  recycle.  Try to
ef10: 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74   locate a page t
ef20: 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20  hat does not.   
ef30: 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73     ** require us
ef40: 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
ef50: 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
ef60: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ef70: 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
ef80: 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20  FirstSynced;..  
ef90: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75      /* If we cou
efa0: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61  ld not find a pa
efb0: 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
efc0: 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e   require an fsyn
efd0: 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  c().      ** on 
efe0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
eff0: 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
f000: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
f010: 68 69 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a  his is a.      *
f020: 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72  * very slow oper
f030: 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72  ation, so we wor
f040: 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20  k hard to avoid 
f050: 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d  it.  But sometim
f060: 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  es.      ** it c
f070: 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a  an't be helped..
f080: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
f090: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
f0a0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79       int rc = sy
f0b0: 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
f0c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
f0d0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
f0e0: 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
f0f0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
f100: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
f110: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f120: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
f130: 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
f140: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  r->pFirst;.     
f150: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
f160: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b   pPg->nRef==0 );
f170: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
f180: 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
f190: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
f1a0: 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20  f it is dirty.. 
f1b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
f1c0: 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
f1d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f1e0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
f1f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   );.        pPg-
f200: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
f210: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
f220: 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20  write_pagelist( 
f230: 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69  pPg );.        i
f240: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f250: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f260: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
f270: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
f280: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
f290: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
f2a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f2b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
f2c0: 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  >dirty==0 );..  
f2d0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
f2e0: 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
f2f0: 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
f300: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
f310: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73   then.      ** s
f320: 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
f330: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
f340: 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
f350: 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  g the.      ** s
f360: 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  qlite_dont_rollb
f370: 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
f380: 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
f390: 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
f3a0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74  ion..      ** It
f3b0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
f3c0: 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
f3d0: 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
f3e0: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
f3f0: 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62        ** might b
f400: 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
f410: 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
f420: 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
f430: 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
f440: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
f450: 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  was marked alway
f460: 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73  sRollback.  This
f470: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20   means that all 
f480: 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20  pages must.     
f490: 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
f4a0: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
f4b0: 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
f4c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f4d0: 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
f4e0: 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
f4f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61      pPager->alwa
f500: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
f510: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f520: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64  * Unlink the old
f530: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
f540: 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ree list and the
f550: 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20   hash table.    
f560: 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e    */.      unlin
f570: 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
f580: 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b    pPager->nOvfl+
f590: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  +;.    }.    pPg
f5a0: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
f5b0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
f5c0: 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  InJournal && (in
f5d0: 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
f5e0: 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
f5f0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
f600: 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61  Memory(pPager->a
f610: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f  InJournal, pgno/
f620: 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  8);.      assert
f630: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f640: 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70  lOpen );.      p
f650: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
f660: 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
f670: 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
f680: 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
f690: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
f6a0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Sync = 0;.    }e
f6b0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
f6c0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
f6d0: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
f6e0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
f6f0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
f700: 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67  nStmt && (int)pg
f710: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
f720: 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
f730: 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49    && (pPager->aI
f740: 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20  nStmt[pgno/8] & 
f750: 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
f760: 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  0 ){.      page_
f770: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
f780: 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
f790: 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d  {.      page_rem
f7a0: 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69  ove_from_stmt_li
f7b0: 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
f7c0: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
f7d0: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  0;.    pPg->nRef
f7e0: 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46   = 1;.    REFINF
f7f0: 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67  O(pPg);.    pPag
f800: 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
f810: 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
f820: 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  gno);.    pPg->p
f830: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
f840: 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
f850: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
f860: 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
f870: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
f880: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
f890: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
f8a0: 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
f8b0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
f8c0: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
f8d0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
f8e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45    if( pPager->nE
f8f0: 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20  xtra>0 ){.      
f900: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
f910: 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
f920: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
f930: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
f940: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29  ager->dbSize<0 )
f950: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
f960: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
f970: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
f980: 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
f990: 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
f9a0: 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
f9b0: 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
f9c0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
f9d0: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
f9e0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
f9f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
fa00: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
fa10: 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  t)pgno ){.      
fa20: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
fa30: 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53 51  DATA(pPg), 0, SQ
fa40: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
fa50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fa60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
fa70: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
fa80: 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
fa90: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
faa0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
fab0: 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
fac0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
fad0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fae0: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
faf0: 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
fb00: 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45  ATA(pPg), SQLITE
fb10: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
fb20: 20 20 20 54 52 41 43 45 32 28 22 46 45 54 43 48     TRACE2("FETCH
fb30: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
fb40: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
fb50: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
fb60: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
fb70: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
fb80: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
fb90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fba0: 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a     off_t fileSiz
fbb0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
fbc0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
fbd0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69  (&pPager->fd,&fi
fbe0: 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f  leSize)!=SQLITE_
fbf0: 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK.             
fc00: 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70    || fileSize>=p
fc10: 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  gno*SQLITE_PAGE_
fc20: 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
fc30: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
fc40: 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
fc50: 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
fc60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fc70: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
fc80: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
fc90: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
fca0: 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  ), 0, SQLITE_PAG
fcb0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
fcc0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
fcd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
fce0: 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
fcf0: 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
fd00: 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
fd10: 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b   pPager->nHit++;
fd20: 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
fd30: 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
fd40: 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  e = PGHDR_TO_DAT
fd50: 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  A(pPg);.  return
fd60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fd70: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
fd80: 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
fd90: 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
fda0: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
fdb0: 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
fdc0: 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
fdd0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
fde0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
fdf0: 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
fe00: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
fe10: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
fe20: 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
fe30: 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  _get().  The dif
fe40: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
fe50: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
fe60: 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  and sqlite3pager
fe70: 5f 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  _get() is that _
fe80: 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
fe90: 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
fea0: 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
feb0: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
fec0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
fed0: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
fee0: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
fef0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
ff00: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
ff10: 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
ff20: 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
ff30: 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
ff40: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70  /.void *sqlite3p
ff50: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
ff60: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
ff70: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
ff80: 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
ff90: 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
ffa0: 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
ffb0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
ffc0: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
ffd0: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
ffe0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
fff0: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
10000 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
10010 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
10020 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10030 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
10040 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
10050 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
10060 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
10070 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
10080 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
10090 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
100a0 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
100b0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
100c0 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
100d0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
100e0 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
100f0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
10100 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
10110 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
10120 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
10130 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
10140 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
10150 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
10160 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  _unref(void *pDa
10170 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
10180 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  g;..  /* Decreme
10190 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
101a0 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
101b0 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20  page.  */.  pPg 
101c0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
101d0 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
101e0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
101f0 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
10200 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
10210 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
10220 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
10230 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
10240 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
10250 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
10260 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
10270 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
10280 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
10290 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
102a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
102b0 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
102c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
102d0 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30  g->pNextFree = 0
102e0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
102f0 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Free = pPager->p
10300 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Last;.    pPager
10310 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20  ->pLast = pPg;. 
10320 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
10330 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
10340 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
10350 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a  NextFree = pPg;.
10360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10370 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
10380 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
10390 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
103a0 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
103b0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
103c0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
103d0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
103e0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
103f0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
10400 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
10410 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
10420 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67  ctor(pData, pPag
10430 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
10440 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
10450 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
10460 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
10470 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
10480 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
10490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
104a0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
104b0 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
104c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
104d0 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
104e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
104f0 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72  ef==0 && !pPager
10500 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
10510 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
10520 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
10530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10540 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
10550 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
10560 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
10570 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
10580 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
10590 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
105a0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
105b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
105c0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
105d0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
105e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
105f0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
10600 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
10610 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
10620 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
10630 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
10640 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
10650 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
10660 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
10670 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
10680 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
10690 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
106a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
106b0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
106c0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
106d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
106e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
106f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
10700 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
10710 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
10720 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
10730 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
10740 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
10750 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
10760 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
10770 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
10780 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
10790 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
107a0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
107b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
107c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
107d0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
107e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
107f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
10800 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
10810 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
10820 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
10830 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65  Pager->jfd,pPage
10840 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
10850 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10860 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  K ){.    sqliteF
10870 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
10880 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
10890 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
108a0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
108b0 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
108c0 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
108d0 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
108e0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
108f0 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
10900 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
10910 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
10920 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
10930 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
10940 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  y, &pPager->jfd)
10950 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
10960 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70  nalOpen = 1;.  p
10970 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
10980 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  arted = 0;.  pPa
10990 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
109a0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  0;.  pPager->alw
109b0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
109c0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
109d0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
109e0 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
109f0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
10a00 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
10a10 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10a20 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
10a30 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
10a40 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 2f 2a  r->dbSize;..  /*
10a50 20 43 72 65 61 74 65 20 74 68 65 20 68 65 61 64   Create the head
10a60 65 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  er for the journ
10a70 61 6c 3a 0a 20 20 2a 2a 20 2d 20 38 20 62 79 74  al:.  ** - 8 byt
10a80 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
10a90 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
10aa0 72 6d 61 74 2e 0a 20 20 2a 2a 20 2d 20 34 20 62  rmat..  ** - 4 b
10ab0 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
10ac0 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
10ad0 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
10ae0 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 20 20  c mode is on..  
10af0 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4d 61  ** - 4 bytes: Ma
10b00 67 69 63 20 75 73 65 64 20 66 6f 72 20 70 61 67  gic used for pag
10b10 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a 20 20 2a  e checksums..  *
10b20 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
10b30 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
10b40 67 65 20 63 6f 75 6e 74 2e 0a 20 20 2a 2a 20 2d  ge count..  ** -
10b50 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
10b60 20 6f 66 20 62 79 74 65 73 20 72 65 73 65 72 76   of bytes reserv
10b70 65 64 20 66 6f 72 20 6d 61 73 74 65 72 20 6a 6f  ed for master jo
10b80 75 72 6e 61 6c 20 70 74 72 20 28 6e 4d 61 73 74  urnal ptr (nMast
10b90 65 72 29 0a 20 20 2a 2a 20 2d 20 6e 4d 61 73 74  er).  ** - nMast
10ba0 65 72 20 62 79 74 65 73 3a 20 53 70 61 63 65 20  er bytes: Space 
10bb0 66 6f 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  for a master jou
10bc0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2e 0a 20 20  rnal pointer..  
10bd0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
10be0 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
10bf0 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
10c00 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
10c10 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
10c20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10c30 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72  K ){.    rc = wr
10c40 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
10c50 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
10c60 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
10c70 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  fff : 0);.  }.  
10c80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10c90 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
10ca0 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
10cb0 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
10cc0 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
10cd0 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72  ksumInit);.    r
10ce0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10cf0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
10d00 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
10d10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10d20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10d30 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
10d40 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
10d50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
10d60 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
10d70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10d80 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10d90 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
10da0 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 29 3b  Pager->nMaster);
10db0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
10dc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10dd0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
10de0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 32 34 20 2b  Pager->jfd, 24 +
10df0 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72   pPager->nMaster
10e00 20 2d 20 31 29 3b 0a 20 20 20 20 72 63 20 3d 20   - 1);.    rc = 
10e10 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
10e20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
10e30 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69  00", 1);.  }.  i
10e40 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
10e50 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
10e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10e70 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
10e80 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61  r_stmt_begin(pPa
10e90 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
10ea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10eb0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
10ec0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
10ed0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
10ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10ef0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10f00 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
10f10 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
10f20 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
10f30 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
10f40 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
10f50 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
10f60 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
10f70 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
10f80 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
10f90 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
10fa0 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20  ger_commit() is 
10fb0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
10fc0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
10fd0 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
10fe0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
10ff0 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20  e3pager_close() 
11000 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
11010 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
11020 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  unref() is calle
11030 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
11040 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
11050 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
11060 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
11070 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
11080 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
11090 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
110a0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
110b0 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
110c0 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
110d0 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
110e0 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
110f0 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
11100 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
11110 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
11120 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
11130 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
11140 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
11150 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
11160 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
11170 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
11180 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
11190 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
111a0 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
111b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
111c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
111d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
111e0 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
111f0 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
11200 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
11210 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
11220 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
11230 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
11240 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
11250 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
11260 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
11270 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
11280 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
11290 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
112a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
112b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
112c0 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
112d0 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
112e0 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
112f0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
11300 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
11310 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a  ger_begin(void *
11320 70 44 61 74 61 2c 20 69 6e 74 20 6e 4d 61 73 74  pData, int nMast
11330 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
11340 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
11350 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
11360 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
11370 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
11380 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11390 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
113a0 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
113b0 28 20 6e 4d 61 73 74 65 72 3e 3d 30 20 29 3b 0a  ( nMaster>=0 );.
113c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
113d0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
113e0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
113f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
11400 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
11410 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11420 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
11430 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
11440 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
11450 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
11460 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
11470 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
11480 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
11490 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
114a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
114b0 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20  nt busy = 1;.   
114c0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
114d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
114e0 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
114f0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
11500 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63        }while( rc
11510 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
11520 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67   .          pPag
11530 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
11540 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 70   && .          p
11550 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
11560 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20  ler->xFunc && . 
11570 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
11580 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78  >pBusyHandler->x
11590 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75  Func(pPager->pBu
115a0 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c  syHandler->pArg,
115b0 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20 20 29   busy++).      )
115c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
115d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
115e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
115f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
11600 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20 3d 20  ager->nMaster = 
11610 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20 20 70  nMaster;.      p
11620 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
11630 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
11640 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
11650 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
11660 20 20 20 54 52 41 43 45 33 28 22 54 52 41 4e 53     TRACE3("TRANS
11670 41 43 54 49 4f 4e 20 25 64 20 6e 4d 61 73 74 65  ACTION %d nMaste
11680 72 3d 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  r=%d\n", pPager-
11690 3e 66 64 2e 68 2c 20 6e 4d 61 73 74 65 72 29 3b  >fd.h, nMaster);
116a0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
116b0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
116c0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
116d0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
116e0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
116f0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
11700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11720 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
11730 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
11740 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
11750 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
11760 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
11770 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
11780 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
11790 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
117a0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
117b0 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
117c0 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
117d0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
117e0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
117f0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
11800 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
11810 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
11820 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
11830 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
11840 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
11850 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
11860 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
11870 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
11880 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
11890 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
118a0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
118b0 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
118c0 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
118d0 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
118e0 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
118f0 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
11900 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
11910 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
11920 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
11930 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
11940 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
11950 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
11960 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
11970 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
11980 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
11990 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
119a0 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
119b0 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
119c0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
119d0 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
119e0 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
119f0 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
11a00 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
11a10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
11a20 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
11a30 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
11a40 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
11a50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
11a60 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70  er_write(void *p
11a70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
11a80 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
11a90 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
11aa0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
11ab0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
11ac0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11ad0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
11ae0 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
11af0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
11b00 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  sk ){ .    retur
11b10 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
11b20 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
11b30 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
11b40 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
11b50 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
11b60 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
11b70 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
11b80 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
11b90 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
11ba0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
11bb0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
11bc0 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
11bd0 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
11be0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
11bf0 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
11c00 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69  urnal && (pPg->i
11c10 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d  nStmt || pPager-
11c20 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
11c30 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
11c40 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
11c50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11c60 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
11c70 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
11c80 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
11c90 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
11ca0 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74 74 65  o be.  ** writte
11cb0 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
11cc0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
11cd0 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
11ce0 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62  ournal.  ** or b
11cf0 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  oth..  **.  ** F
11d00 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
11d10 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
11d20 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
11d30 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63  xists and.  ** c
11d40 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
11d50 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  oes not..  */.  
11d60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11d70 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
11d80 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  OCK );.  rc = sq
11d90 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e  lite3pager_begin
11da0 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 69 66  (pData, 0);.  if
11db0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11dc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
11dd0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11de0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
11df0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
11e00 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
11e10 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
11e20 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
11e30 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  l ){.    rc = pa
11e40 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
11e50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
11e60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11e70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
11e80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11e90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
11ea0 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
11eb0 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65  urnal );.  pPage
11ec0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
11ed0 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72 61  1;..  /* The tra
11ee0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
11ef0 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
11f00 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
11f10 45 44 20 6f 72 20 61 6e 0a 20 20 2a 2a 20 45 58  ED or an.  ** EX
11f20 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
11f30 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
11f40 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
11f50 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
11f60 74 6f 0a 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  to.  ** the tran
11f70 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
11f80 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
11f90 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a 2f  re already..  */
11fa0 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a  .  if( !pPg->inJ
11fb0 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65  ournal && (pPage
11fc0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  r->useJournal ||
11fd0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 29 20   pPager->memDb) 
11fe0 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  ){.    if( (int)
11ff0 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
12000 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
12010 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 50  ){.      int szP
12020 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73 61 76  g;.      u32 sav
12030 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ed;.      if( pP
12040 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
12050 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
12060 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
12070 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
12080 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ger);.        TR
12090 41 43 45 32 28 22 4a 4f 55 52 4e 41 4c 20 70 61  ACE2("JOURNAL pa
120a0 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  ge %d\n", pPg->p
120b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73  gno);.        as
120c0 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72  sert( pHist->pOr
120d0 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ig==0 );.       
120e0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
120f0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
12100 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
12110 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
12120 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
12130 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
12140 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  y(pHist->pOrig, 
12150 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
12160 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
12170 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
12180 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  .        pPg->in
12190 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
121a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
121b0 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 61    u32 cksum = pa
121c0 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
121d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61  , pPg->pgno, pDa
121e0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 73 61 76  ta);.        sav
121f0 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44  ed = *(u32*)PGHD
12200 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 3b  R_TO_EXTRA(pPg);
12210 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32  .        store32
12220 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c  bits(cksum, pPg,
12230 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
12240 45 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 67  E);.        szPg
12250 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53   = SQLITE_PAGE_S
12260 49 5a 45 2b 38 3b 0a 20 20 20 20 20 20 20 20 73  IZE+8;.        s
12270 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e  tore32bits(pPg->
12280 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a  pgno, pPg, -4);.
12290 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50          CODEC(pP
122a0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
122b0 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
122c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
122d0 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
122e0 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70  >jfd, &((char*)p
122f0 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29  Data)[-4], szPg)
12300 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33  ;.        TRACE3
12310 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25  ("JOURNAL page %
12320 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
12330 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
12340 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
12350 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
12360 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
12370 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  gno, 0);.       
12380 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f   *(u32*)PGHDR_TO
12390 5f 45 58 54 52 41 28 70 50 67 29 20 3d 20 73 61  _EXTRA(pPg) = sa
123a0 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ved;.        if(
123b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
123c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
123d0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
123e0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
123f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
12400 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
12410 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  R_FULL;.        
12420 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
12440 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
12450 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12460 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
12470 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
12480 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
12490 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
124a0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
124b0 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67  &7);.        pPg
124c0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
124d0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
124e0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
124f0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  rnal = 1;.      
12500 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
12510 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
12520 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
12530 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
12540 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
12550 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
12560 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
12570 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
12580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
125a0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
125b0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
125c0 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
125d0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
125e0 20 20 54 52 41 43 45 33 28 22 41 50 50 45 4e 44    TRACE3("APPEND
125f0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
12600 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  c=%d\n", pPg->pg
12610 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
12620 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  c);.    }.    if
12630 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
12640 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
12650 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
12660 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
12670 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
12680 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
12690 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
126a0 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20  not in it,.  ** 
126b0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
126c0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
126d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
126e0 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
126f0 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
12700 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
12710 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
12720 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
12730 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 2a 2a  rnal format.  **
12740 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
12750 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
12760 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
12770 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
12780 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
12790 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
127a0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
127b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
127c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
127d0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
127e0 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
127f0 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
12800 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ize );.    if( p
12810 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
12820 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
12830 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
12840 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
12850 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
12860 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
12870 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 48 69 73  =0 );.      pHis
12880 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  t->pStmt = sqlit
12890 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
128a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
128b0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
128c0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
128d0 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
128e0 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f  pStmt, PGHDR_TO_
128f0 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
12900 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
12910 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
12920 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E2("STMT-JOURNAL
12930 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
12940 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c  ->pgno);.    }el
12950 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 33  se{.      store3
12960 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c  2bits(pPg->pgno,
12970 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20   pPg, -4);.     
12980 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
12990 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
129a0 20 37 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   7);.      rc = 
129b0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
129c0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 28 28  pPager->stfd, ((
129d0 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c 20  char*)pData)-4, 
129e0 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
129f0 2b 34 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  +4);.      TRACE
12a00 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  2("STMT-JOURNAL 
12a10 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d  page %d\n", pPg-
12a20 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f  >pgno);.      CO
12a30 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
12a40 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29  a, pPg->pgno, 0)
12a50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12a70 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
12a80 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
12a90 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
12aa0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
12ab0 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20  AGER_ERR_FULL;. 
12ac0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
12ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12ae0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
12af0 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
12b00 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
12b10 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  t!=0 );.      pP
12b20 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
12b30 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
12b40 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
12b50 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f 61      }.    page_a
12b60 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
12b70 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pPg);.  }..  /* 
12b80 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
12b90 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
12ba0 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
12bb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
12bc0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
12bd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
12be0 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
12bf0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
12c00 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65  ->memDb && pPage
12c10 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49  r->dbSize==PENDI
12c20 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
12c30 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
12c40 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
12c50 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
12c60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12c70 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
12c80 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
12c90 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
12ca0 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
12cb0 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
12cc0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
12cd0 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
12ce0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
12cf0 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
12d00 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
12d10 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
12d20 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
12d30 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
12d40 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  le(void *pData){
12d50 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
12d60 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
12d70 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
12d80 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  Pg->dirty;.}../*
12d90 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
12da0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
12db0 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68  gle page with th
12dc0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
12dd0 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72   the third.** ar
12de0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
12df0 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72  qlite3pager_over
12e00 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
12e10 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
12e20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
12e30 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69  void *pPage;.  i
12e40 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  nt rc;..  rc = s
12e50 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
12e60 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
12e70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
12e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12e90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
12ea0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
12eb0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12ec0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12ed0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70   memcpy(pPage, p
12ee0 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47  Data, SQLITE_PAG
12ef0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20  E_SIZE);.    }. 
12f00 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
12f10 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
12f20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12f30 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
12f40 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
12f50 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
12f60 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
12f70 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
12f80 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
12f90 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e  ion on page "pgn
12fa0 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  o" back to the d
12fb0 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
12fc0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
12fd0 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
12fe0 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
12ff0 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
13000 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
13010 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
13020 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
13030 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
13040 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
13050 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
13060 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
13070 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
13080 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
13090 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
130a0 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
130b0 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
130c0 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
130d0 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
130e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
130f0 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  t_rollback() bel
13100 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
13110 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
13120 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
13130 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
13140 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
13150 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
13160 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
13170 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
13180 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
13190 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
131a0 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
131b0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
131c0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ls to sqlite3pag
131d0 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
131e0 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
131f0 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
13200 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
13210 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
13220 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
13230 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
13240 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
13250 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
13260 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
13270 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
13280 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
13290 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
132a0 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
132b0 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
132c0 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
132d0 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
132e0 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
132f0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
13300 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
13310 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
13320 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
13330 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13340 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
13350 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f  ed,.** the dont_
13360 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  rollback() routi
13370 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
13380 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ut because the p
13390 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  age contains.** 
133a0 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
133b0 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
133c0 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20  be sure it gets 
133d0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
133e0 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64  pite.** of the d
133f0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63  ont_rollback() c
13400 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
13410 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77  ite3pager_dont_w
13420 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
13430 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
13440 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
13450 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
13460 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  Db ) return;..  
13470 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
13480 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
13490 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  ;.  pPg->alwaysR
134a0 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
134b0 66 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64  f( pPg && pPg->d
134c0 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20  irty ){.    if( 
134d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
134e0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
134f0 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
13500 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
13510 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
13520 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
13530 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
13540 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
13550 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
13560 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
13570 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
13580 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
13590 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
135a0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
135b0 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
135c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
135d0 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
135e0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
135f0 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
13600 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
13610 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
13620 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
13630 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
13640 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
13650 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
13660 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
13670 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
13680 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
13690 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
136a0 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
136b0 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
136c0 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
136d0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
136e0 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
136f0 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
13700 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
13710 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13720 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57    TRACE3("DONT_W
13730 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
13740 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70 50 61  %d\n", pgno, pPa
13750 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
13760 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
13770 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
13780 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
13790 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
137a0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
137b0 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
137c0 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
137d0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
137e0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
137f0 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
13800 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
13810 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
13820 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
13830 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
13840 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
13850 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
13860 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rnal..*/.void sq
13870 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
13880 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  rollback(void *p
13890 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
138a0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
138b0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
138c0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
138d0 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66  g->pPager;..  if
138e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
138f0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
13900 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13910 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74  nalOpen==0 ) ret
13920 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
13930 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
13940 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73  | pPager->always
13950 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
13960 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65 74 75  er->memDb ) retu
13970 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
13980 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
13990 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
139a0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
139b0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
139c0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
139d0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
139e0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
139f0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
13a00 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
13a10 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
13a20 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
13a30 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
13a40 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
13a50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
13a60 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
13a70 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
13a80 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
13a90 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
13aa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
13ab0 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
13ac0 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
13ad0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  n", pPg->pgno, p
13ae0 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
13af0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
13b00 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
13b10 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
13b20 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
13b30 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
13b40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
13b50 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
13b60 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
13b70 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
13b80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13b90 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
13ba0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
13bb0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
13bc0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
13bd0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
13be0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
13bf0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a  _list(pPg);.  }.
13c00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
13c10 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63  a PgHistory bloc
13c20 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  k.*/.static void
13c30 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67   clearHistory(Pg
13c40 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b  History *pHist){
13c50 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
13c60 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73  ist->pOrig);.  s
13c70 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
13c80 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
13c90 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
13ca0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
13cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
13cc0 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
13cd0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
13ce0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
13cf0 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
13d00 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
13d10 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
13d20 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
13d30 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
13d40 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
13d50 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
13d60 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
13d70 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
13d80 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
13d90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
13da0 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65  ager_commit(Page
13db0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
13dc0 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
13dd0 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
13de0 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45  r->errMask==PAGE
13df0 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
13e00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
13e10 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
13e20 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
13e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13e40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13e50 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
13e60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
13e70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
13e80 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
13e90 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
13ea0 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
13eb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
13ec0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
13ed0 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
13ee0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
13ef0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13f00 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d  }.  TRACE2("COMM
13f10 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  IT %d\n", pPager
13f20 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70  ->fd.h);.  if( p
13f30 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
13f40 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
13f50 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
13f60 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
13f70 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
13f80 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
13f90 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
13fa0 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
13fb0 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
13fc0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
13fd0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
13fe0 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
13ff0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
14000 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
14010 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
14020 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
14030 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
14040 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
14050 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
14060 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
14070 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
14080 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
14090 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
140a0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
140b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
140c0 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
140d0 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
140e0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
140f0 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
14100 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
14110 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
14120 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67  .#endif.    pPag
14130 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
14140 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
14150 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
14160 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14170 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
14180 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
14190 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  che==0 ){.    /*
141a0 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74   Exit early (wit
141b0 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74  hout doing the t
141c0 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71  ime-consuming sq
141d0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61  lite3OsSync() ca
141e0 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74  lls).    ** if t
141f0 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
14200 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  o changes to the
14210 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14220 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
14230 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d  Pager->needSync=
14240 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
14250 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
14260 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
14270 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
14280 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
14290 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
142a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
142b0 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
142c0 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
142d0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66  pPager, 0);.  if
142e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
142f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  ){.    goto comm
14300 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  it_abort;.  }.  
14310 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
14320 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
14330 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
14340 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
14350 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  rc;..  /* Jump h
14360 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ere if anything 
14370 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e  goes wrong durin
14380 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
14390 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69  cess..  */.commi
143a0 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20  t_abort:.  rc = 
143b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
143c0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
143d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
143e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
143f0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
14400 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14410 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
14420 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65  ll changes.  The
14430 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
14440 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
14450 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c  ARED mode..** Al
14460 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  l in-memory cach
14470 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74  e pages revert t
14480 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  o their original
14490 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a   data contents..
144a0 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** The journal i
144b0 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
144c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
144d0 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73  nnot fail unless
144e0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
144f0 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
14500 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72  wing.** the corr
14510 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  ect locking prot
14520 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f  ocol (SQLITE_PRO
14530 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73  TOCOL) or unless
14540 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
14550 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
14560 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
14570 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
14580 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
14590 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
145a0 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
145b0 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
145c0 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
145d0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
145e0 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
145f0 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
14600 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
14610 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
14620 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
14630 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
14640 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  rollback(Pager *
14650 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
14660 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c  c;.  TRACE2("ROL
14670 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61  LBACK %d\n", pPa
14680 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66  ger->fd.h);.  if
14690 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
146a0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
146b0 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
146c0 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
146d0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
146e0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
146f0 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
14700 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
14710 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
14720 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
14730 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
14740 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
14750 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
14760 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
14770 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14780 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
14790 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
147a0 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
147b0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
147c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
147d0 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
147e0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
147f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
14800 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
14810 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
14820 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
14830 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
14840 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
14850 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  e);.        TRAC
14860 45 32 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E2("ROLLBACK-PAG
14870 45 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  E %d\n", p->pgno
14880 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14890 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22          TRACE2("
148a0 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
148b0 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20  \n", p->pgno);. 
148c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
148d0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
148e0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
148f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
14900 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
14910 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20      p->inStmt = 
14920 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  0;.      p->pPre
14930 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74  vStmt = p->pNext
14940 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Stmt = 0;..     
14950 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
14960 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
14970 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
14980 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
14990 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  A(p), pPager->pa
149a0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
149b0 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  .      .    }.  
149c0 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
149d0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
149e0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
149f0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
14a00 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
14a10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
14a20 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
14a30 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
14a40 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
14a50 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
14a60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14a70 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
14a80 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
14a90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14aa0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
14ab0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
14ac0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
14ad0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14ae0 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
14af0 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
14b00 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
14b10 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   && pPager->errM
14b20 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask!=PAGER_ERR_F
14b30 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
14b40 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
14b50 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
14b60 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
14b70 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
14b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
14b90 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
14ba0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
14bb0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
14bc0 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
14bd0 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
14be0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14bf0 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
14c00 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d  ager);.    rc2 =
14c10 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
14c20 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14c30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14c40 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
14c50 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  rc2;.    }.  }el
14c60 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
14c70 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
14c80 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66  er, 1);.  }.  if
14c90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14ca0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14cb0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
14cc0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
14cd0 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  |= PAGER_ERR_COR
14ce0 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RUPT;.  }.  pPag
14cf0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
14d00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14d10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
14d20 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
14d30 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
14d40 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
14d50 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
14d60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
14d70 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
14d80 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
14d90 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61  lite3pager_isrea
14da0 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
14db0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
14dc0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
14dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14de0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
14df0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
14e00 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
14e10 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67  .int *sqlite3pag
14e20 65 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a  er_stats(Pager *
14e30 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
14e40 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b  c int a[9];.  a[
14e50 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
14e60 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
14e70 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
14e80 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
14e90 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
14ea0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
14eb0 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
14ec0 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
14ed0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20  ager->errMask;. 
14ee0 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
14ef0 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
14f00 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
14f10 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[8] = pPager->n
14f20 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  Ovfl;.  return a
14f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
14f40 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
14f50 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
14f60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14f70 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
14f80 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
14f90 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
14fa0 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
14fb0 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
14fc0 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
14fd0 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
14fe0 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
14ff0 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
15000 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
15010 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
15020 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
15030 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
15040 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50  ger_stmt_begin(P
15050 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15060 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
15070 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
15080 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61  PNAME_SIZE];.  a
15090 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
150a0 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 54  stmtInUse );.  T
150b0 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
150c0 4e 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  N %d\n", pPager-
150d0 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50  >fd.h);.  if( pP
150e0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
150f0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
15100 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  nUse = 1;.    pP
15110 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
15120 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
15130 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15140 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
15150 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
15160 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61  lOpen ){.    pPa
15170 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
15180 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  n = 1;.    retur
15190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
151a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
151b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
151c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ;.  pPager->aInS
151d0 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
151e0 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
151f0 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
15200 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
15210 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
15220 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65  te3OsLock(&pPage
15230 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
15240 43 4b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  CK);.    return 
15250 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15260 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
15270 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
15280 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
15290 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
152a0 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
152b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
152c0 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
152d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
152e0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 0a  ->stmtJSize == .
152f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
15300 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  *JOURNAL_PG_SZ(p
15310 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
15320 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
15330 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
15340 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 0a  er->stmtJSize =.
15350 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
15360 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  c*JOURNAL_PG_SZ(
15370 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
15380 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
15390 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
153a0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
153b0 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50  bSize;.  if( !pP
153c0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
153d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
153e0 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  e3pager_opentemp
153f0 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d  (zTemp, &pPager-
15400 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20  >stfd);.    if( 
15410 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
15420 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
15430 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
15440 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  n = 1;.    pPage
15450 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
15460 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
15470 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
15480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15490 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66  ;. .stmt_begin_f
154a0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61  ailed:.  if( pPa
154b0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a  ger->aInStmt ){.
154c0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
154d0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b  Pager->aInStmt);
154e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
154f0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
15500 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15510 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61  .** Commit a sta
15520 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
15530 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
15540 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  _commit(Pager *p
15550 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
15560 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
15570 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
15580 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54  g, *pNext;.    T
15590 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d  RACE2("STMT-COMM
155a0 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  IT %d\n", pPager
155b0 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69 66 28  ->fd.h);.    if(
155c0 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
155d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
155e0 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
155f0 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  stfd, 0);.      
15600 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  /* sqlite3OsTrun
15610 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74  cate(&pPager->st
15620 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
15630 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
15640 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a  ger->aInStmt );.
15650 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
15660 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
15670 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
15680 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
15690 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
156a0 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
156b0 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
156c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
156d0 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
156e0 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
156f0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
15700 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
15710 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
15720 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
15730 62 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  b ){.        PgH
15740 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
15750 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
15760 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
15770 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
15780 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
15790 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
157a0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
157b0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
157c0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
157d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
157e0 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
157f0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
15800 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
15810 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
15820 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15830 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
15840 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
15850 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
15860 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f  te3pager_stmt_ro
15870 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
15880 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
15890 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
158a0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
158b0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c  TRACE2("STMT-ROL
158c0 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61  LBACK %d\n", pPa
158d0 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
158e0 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
158f0 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  b ){.      PgHdr
15900 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
15910 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
15920 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
15930 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
15940 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
15950 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
15960 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
15970 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
15980 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
15990 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
159a0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
159b0 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
159c0 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
159d0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
159e0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
159f0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
15a00 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
15a10 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
15a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
15a30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
15a40 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
15a50 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
15a60 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
15a70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15a80 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
15a90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
15aa0 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
15ab0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
15ac0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
15ad0 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
15ae0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
15af0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
15b00 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
15b10 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
15b20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15b30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
15b40 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
15b50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15b60 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
15b70 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
15b80 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
15b90 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
15ba0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
15bb0 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
15bc0 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
15bd0 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
15be0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
15bf0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
15c00 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28  e3pager_dirname(
15c10 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15c20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
15c30 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
15c40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
15c50 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
15c60 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
15c70 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
15c80 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
15c90 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  journalname(Page
15ca0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
15cb0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
15cc0 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
15cd0 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
15ce0 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
15cf0 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
15d00 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50  r_set_codec(.  P
15d10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
15d20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76  void (*xCodec)(v
15d30 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
15d40 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
15d50 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
15d60 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
15d70 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
15d80 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
15d90 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ecArg;.}../*.** 
15da0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15db0 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
15dc0 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
15dd0 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
15de0 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
15df0 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
15e00 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
15e10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15e20 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
15e30 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
15e40 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61  er){.  void *pPa
15e50 67 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  ge;.  PgHdr *pPg
15e60 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67  Hdr;.  u32 chang
15e70 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74  e_counter;.  int
15e80 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20   rc;..  /* Open 
15e90 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
15ea0 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
15eb0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
15ec0 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
15ed0 72 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, 1, &pPage);. 
15ee0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15ef0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
15f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
15f10 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
15f20 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15f30 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
15f40 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  c;..  /* Read th
15f50 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
15f60 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  at byte 24. */. 
15f70 20 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54   pPgHdr = DATA_T
15f80 4f 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a  O_PGHDR(pPage);.
15f90 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
15fa0 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74   = retrieve32bit
15fb0 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a  s(pPgHdr, 24);..
15fc0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
15fd0 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
15fe0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
15ff0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
16000 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
16010 6e 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33  nter++;.  store3
16020 32 62 69 74 73 28 63 68 61 6e 67 65 5f 63 6f 75  2bits(change_cou
16030 6e 74 65 72 2c 20 70 50 67 48 64 72 2c 20 32 34  nter, pPgHdr, 24
16040 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
16050 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
16060 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nce. */.  sqlite
16070 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
16080 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ge);.  return SQ
16090 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
160a0 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
160b0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
160c0 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
160d0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
160e0 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
160f0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
16100 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
16110 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
16120 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
16130 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
16140 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
16150 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
16160 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
16170 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
16180 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
16190 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
161a0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
161b0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
161c0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
161d0 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
161e0 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
161f0 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
16200 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
16210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16220 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
16230 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
16240 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
16250 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
16260 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
16270 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
16280 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
16290 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
162a0 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
162b0 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
162c0 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
162d0 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
162e0 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
162f0 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
16300 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67  to an sqlite3pag
16310 65 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a  er_sync() call..
16320 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
16330 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a  ger_sync(Pager *
16340 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
16350 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
16360 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16370 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  OK;..  /* If thi
16380 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
16390 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
163a0 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
163b0 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
163c0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
163d0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
163e0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
163f0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
16400 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
16410 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
16420 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26  !pPager->memDb &
16430 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  & pPager->dirtyC
16440 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64  ache ){.    PgHd
16450 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65  r *pPg;.    asse
16460 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
16470 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
16480 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
16490 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
164a0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
164b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
164c0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
164d0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
164e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
164f0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
16500 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
16510 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ster);.    if( r
16520 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
16530 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
16540 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
16550 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
16560 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16570 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
16580 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
16590 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
165a0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
165b0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
165c0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
165d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
165e0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20  to sync_exit;.. 
165f0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
16600 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
16610 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
16620 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
16630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16640 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64  Sync(&pPager->fd
16650 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
16660 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
16670 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a  GER_SYNCED;.  }.
16680 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65  .sync_exit:.  re
16690 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
166a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
166b0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
166c0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
166d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
166e0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
166f0 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f  the file lock fo
16700 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
16710 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  r..** The return
16720 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66   value is one of
16730 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44   NO_LOCK, SHARED
16740 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
16750 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47  LOCK,.** PENDING
16760 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53  _LOCK, or EXCLUS
16770 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74  IVE_LOCK..*/.int
16780 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
16790 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
167a0 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 4f  Pager){.#ifdef O
167b0 53 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e 20  S_TEST.  return 
167c0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c  pPager->fd->fd.l
167d0 6f 63 6b 74 79 70 65 3b 0a 23 65 6c 73 65 0a 20  ocktype;.#else. 
167e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
167f0 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6e  fd.locktype;.#en
16800 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  dif.}.#endif..#i
16810 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
16820 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
16830 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
16840 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
16850 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
16860 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
16870 74 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70  te3pager_refdump
16880 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
16890 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
168a0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
168b0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
168c0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
168d0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
168e0 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  f<=0 ) continue;
168f0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 41 47  .    printf("PAG
16900 45 20 25 33 64 20 61 64 64 72 3d 30 78 25 30 38  E %3d addr=0x%08
16910 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20  x nRef=%d\n", . 
16920 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c        pPg->pgno,
16930 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44   (int)PGHDR_TO_D
16940 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
16950 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
16960 69 66 0a                                         if.