/ Hex Artifact Content
Login

Artifact 1156c264f314142fd73eedf5ad27e42b279227b0:


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 34  : pager.c,v 1.14
0350: 36 20 32 30 30 34 2f 30 36 2f 32 38 20 30 31 3a  6 2004/06/28 01:
0360: 31 36 3a 34 36 20 64 61 6e 69 65 6c 6b 31 39 37  16:46 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 42 75 73 79 48  abase */.  BusyH
29a0: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
29b0: 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  dler;  /* Pointe
29c0: 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79  r to sqlite.busy
29d0: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48  Handler */.  PgH
29e0: 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61  dr *pFirst, *pLa
29f0: 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
2a00: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a   of free pages *
2a10: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
2a20: 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  tSynced;        
2a30: 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61  /* First free pa
2a40: 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65  ge with PgHdr.ne
2a50: 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50  edSync==0 */.  P
2a60: 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20  gHdr *pAll;     
2a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2a80: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
2a90: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d  */.  PgHdr *pStm
2aa0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2ab0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
2ac0: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
2ad0: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  nt subjournal */
2ae0: 0a 20 20 50 67 48 64 72 20 2a 61 48 61 73 68 5b  .  PgHdr *aHash[
2af0: 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f  N_PG_HASH];    /
2b00: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20  * Hash table to 
2b10: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
2b20: 74 6f 20 50 67 48 64 72 20 2a 2f 0a 20 20 6f 66  to PgHdr */.  of
2b30: 66 5f 74 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  f_t journalOff; 
2b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2b50: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
2b60: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
2b70: 66 69 6c 65 20 2a 2f 0a 20 20 6f 66 66 5f 74 20  file */.  off_t 
2b80: 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20  journalHdr;     
2b90: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
2ba0: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
2bb0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
2bc0: 2a 2f 0a 20 20 6f 66 66 5f 74 20 73 74 6d 74 48  */.  off_t stmtH
2bd0: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
2be0: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
2bf0: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
2c00: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
2c10: 2a 2f 0a 20 20 6f 66 66 5f 74 20 73 74 6d 74 43  */.  off_t stmtC
2c20: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
2c30: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
2c40: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
2c50: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 6e   started */.  in
2c60: 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  t sectorSize;   
2c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
2c80: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
2c90: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
2ca0: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
2cb0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2cc0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
2cd0: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
2ce0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
2cf0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
2d00: 65 73 65 20 61 72 65 20 62 69 74 73 20 74 68 61  ese are bits tha
2d10: 74 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20  t can be set in 
2d20: 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a  Pager.errMask..*
2d30: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
2d40: 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30  ERR_FULL     0x0
2d50: 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20  1  /* a write() 
2d60: 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  failed */.#defin
2d70: 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20  e PAGER_ERR_MEM 
2d80: 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61       0x02  /* ma
2d90: 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f  lloc() failed */
2da0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
2db0: 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34  RR_LOCK     0x04
2dc0: 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68    /* error in th
2dd0: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  e locking protoc
2de0: 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ol */.#define PA
2df0: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
2e00: 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61   0x08  /* databa
2e10: 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f  se or journal co
2e20: 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66  rruption */.#def
2e30: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49  ine PAGER_ERR_DI
2e40: 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20  SK     0x10  /* 
2e50: 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f  general disk I/O
2e60: 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72   error - bad har
2e70: 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a  d drive? */../*.
2e80: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
2e90: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
2ea0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
2eb0: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
2ec0: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
2ed0: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
2ee0: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
2ef0: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
2f00: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
2f10: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
2f20: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
2f30: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
2f40: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
2f50: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
2f60: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
2f70: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
2f80: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
2f90: 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74  is begin.** writ
2fa0: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
2fb0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
2fc0: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
2fd0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
2fe0: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
2ff0: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
3000: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
3010: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
3020: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
3030: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
3040: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
3050: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
3060: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
3070: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
3080: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
3090: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
30a0: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
30b0: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
30c0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
30d0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
30e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
30f0: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
3100: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
3110: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
3120: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
3130: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
3140: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
3150: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
3160: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
3170: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
3180: 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  E bytes of data 
3190: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
31a0: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
31b0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
31c0: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
31d0: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
31e0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
31f0: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
3200: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
3210: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
3220: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
3230: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
3240: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
3250: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
3260: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
3270: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
3280: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
3290: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
32a0: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
32b0: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
32c0: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
32d0: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
32e0: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
32f0: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
3300: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
3310: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
3320: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
3330: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
3340: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
3350: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
3360: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
3370: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
3380: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
3390: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
33a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
33b0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
33c0: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
33d0: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
33e0: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
33f0: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
3400: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
3410: 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20  der and of each 
3420: 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
3430: 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65  nal is determine
3440: 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c  d.** by the foll
3450: 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f  owing macros..*/
3460: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3470: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20  _PG_SZ(pPager)  
3480: 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ((pPager->pageSi
3490: 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20  ze) + 8)../*.** 
34a0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
34b0: 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  er size for this
34c0: 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66   pager. In the f
34d0: 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c  uture, this coul
34e0: 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73  d be.** set to s
34f0: 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  ome value read f
3500: 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e  rom the disk con
3510: 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70  troller. The imp
3520: 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63  ortant.** charac
3530: 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74  teristic is that
3540: 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20   it is the same 
3550: 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73  size as a disk s
3560: 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ector..*/.#defin
3570: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
3580: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
3590: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 23  ->sectorSize)..#
35a0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 45 43  define PAGER_SEC
35b0: 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a 0a 2f 2a  TOR_SIZE 512../*
35c0: 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20  .** Page number 
35d0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73  PAGER_MJ_PGNO is
35e0: 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61   never used in a
35f0: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
3600: 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65  e (it is.** rese
3610: 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67  rved for working
3620: 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77   around a window
3630: 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74  s/posix incompat
3640: 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a  ibility). It is.
3650: 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a  ** used in the j
3660: 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66  ournal to signif
3670: 79 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69  y that the remai
3680: 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  nder of the jour
3690: 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20  nal file .** is 
36a0: 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69  devoted to stori
36b0: 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
36c0: 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65  nal name - there
36d0: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67   are no more pag
36e0: 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61  es to.** roll ba
36f0: 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ck. See comments
3700: 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72   for function wr
3710: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
3720: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
3730: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3740: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e  _MJ_PGNO(x) (PEN
3750: 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e  DING_BYTE/((x)->
3760: 70 61 67 65 53 69 7a 65 29 29 0a 0a 2f 2a 0a 2a  pageSize))../*.*
3770: 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e  * Enable referen
3780: 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e  ce count trackin
3790: 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67  g (for debugging
37a0: 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65  ) here:.*/.#ifde
37b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
37c0: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
37d0: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
37e0: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
37f0: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
3800: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
3810: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
3820: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
3830: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
3840: 65 74 75 72 6e 3b 0a 20 20 20 20 70 72 69 6e 74  eturn;.    print
3850: 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e  f(.       "REFCN
3860: 54 3a 20 25 34 64 20 61 64 64 72 3d 30 78 25 30  T: %4d addr=0x%0
3870: 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20  8x nRef=%d\n",. 
3880: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 28        p->pgno, (
3890: 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  int)PGHDR_TO_DAT
38a0: 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20  A(p), p->nRef.  
38b0: 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20    );.    cnt++; 
38c0: 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74    /* Something t
38d0: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
38e0: 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64  nt on */.  }.# d
38f0: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
3900: 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28    pager_refinfo(
3910: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
3920: 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e  e REFINFO(X).#en
3930: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
3940: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
3950: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
3960: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
3970: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
3980: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
3990: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
39a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
39b0: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
39c0: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
39d0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
39e0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
39f0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
3a00: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
3a10: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
3a20: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
3a30: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 4f  int read32bits(O
3a40: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a  sFile *fd, u32 *
3a50: 70 52 65 73 29 7b 0a 20 20 75 33 32 20 72 65 73  pRes){.  u32 res
3a60: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  ;.  int rc;.  rc
3a70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
3a80: 28 66 64 2c 20 26 72 65 73 2c 20 73 69 7a 65 6f  (fd, &res, sizeo
3a90: 66 28 72 65 73 29 29 3b 0a 20 20 69 66 28 20 72  f(res));.  if( r
3aa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3ab0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
3ac0: 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d  r ac[4];.    mem
3ad0: 63 70 79 28 61 63 2c 20 26 72 65 73 2c 20 34 29  cpy(ac, &res, 4)
3ae0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 28 61 63 5b  ;.    res = (ac[
3af0: 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d  0]<<24) | (ac[1]
3b00: 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c  <<16) | (ac[2]<<
3b10: 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a  8) | ac[3];.  }.
3b20: 20 20 2a 70 52 65 73 20 3d 20 72 65 73 3b 0a 20    *pRes = res;. 
3b30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3b40: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
3b50: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
3b60: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
3b70: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
3b80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
3b90: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
3ba0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
3bb0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
3bc0: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
3bd0: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
3be0: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20  OsFile *fd, u32 
3bf0: 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  val){.  unsigned
3c00: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 61   char ac[4];.  a
3c10: 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29  c[0] = (val>>24)
3c20: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d   & 0xff;.  ac[1]
3c30: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
3c40: 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28  xff;.  ac[2] = (
3c50: 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a  val>>8) & 0xff;.
3c60: 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20    ac[3] = val & 
3c70: 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 73  0xff;.  return s
3c80: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
3c90: 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a  , ac, 4);.}../*.
3ca0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 33 32 2d  ** Write the 32-
3cb0: 62 69 74 20 69 6e 74 65 67 65 72 20 27 76 61 6c  bit integer 'val
3cc0: 27 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  ' into the page 
3cd0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
3ce0: 67 65 20 68 65 61 64 65 72 0a 2a 2a 20 27 70 27  ge header.** 'p'
3cf0: 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73   at offset 'offs
3d00: 65 74 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  et'..*/.static v
3d10: 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74 73 28  oid store32bits(
3d20: 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20 2a  u32 val, PgHdr *
3d30: 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  p, int offset){.
3d40: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3d50: 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75  *ac;.  ac = &((u
3d60: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47  nsigned char*)PG
3d70: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b  HDR_TO_DATA(p))[
3d80: 6f 66 66 73 65 74 5d 3b 0a 20 20 61 63 5b 30 5d  offset];.  ac[0]
3d90: 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30   = (val>>24) & 0
3da0: 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28  xff;.  ac[1] = (
3db0: 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b  val>>16) & 0xff;
3dc0: 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e  .  ac[2] = (val>
3dd0: 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  >8) & 0xff;.  ac
3de0: 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66  [3] = val & 0xff
3df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
3e00: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
3e10: 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73   at offset 'offs
3e20: 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67  et' from the pag
3e30: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  e identified by.
3e40: 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27  ** page header '
3e50: 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  p'..*/.static u3
3e60: 32 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  2 retrieve32bits
3e70: 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f  (PgHdr *p, int o
3e80: 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e  ffset){.  unsign
3e90: 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61  ed char *ac;.  a
3ea0: 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20  c = &((unsigned 
3eb0: 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
3ec0: 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b  ATA(p))[offset];
3ed0: 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b 30 5d  .  return (ac[0]
3ee0: 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c  <<24) | (ac[1]<<
3ef0: 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29  16) | (ac[2]<<8)
3f00: 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a   | ac[3];.}.../*
3f10: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
3f20: 62 69 74 73 20 69 6e 20 74 68 65 20 70 50 61 67  bits in the pPag
3f30: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74 6f  er->errMask into
3f40: 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65 0a 2a   an approprate.*
3f50: 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 2a  * return code..*
3f60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
3f70: 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67 65 72  er_errcode(Pager
3f80: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
3f90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3fa0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
3fb0: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
3fc0: 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63 20  RR_LOCK )    rc 
3fd0: 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  = SQLITE_PROTOCO
3fe0: 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  L;.  if( pPager-
3ff0: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
4000: 5f 45 52 52 5f 44 49 53 4b 20 29 20 20 20 20 72  _ERR_DISK )    r
4010: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
4020: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4030: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
4040: 45 52 52 5f 46 55 4c 4c 20 29 20 20 20 20 72 63  ERR_FULL )    rc
4050: 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
4060: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
4070: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
4080: 52 5f 4d 45 4d 20 29 20 20 20 20 20 72 63 20 3d  R_MEM )     rc =
4090: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
40a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
40b0: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
40c0: 5f 43 4f 52 52 55 50 54 20 29 20 72 63 20 3d 20  _CORRUPT ) rc = 
40d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
40e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
40f0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
4100: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
4110: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
4120: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
4130: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65   be open..** The
4140: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4150: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61  file name is rea
4160: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  d from the end o
4170: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a  f the file and .
4180: 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
4190: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
41a0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
41b0: 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69  c(). *pzMaster i
41c0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e  s.** set to poin
41d0: 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  t at the memory 
41e0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
41f0: 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
4200: 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74  er must.** sqlit
4210: 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65  eFree() *pzMaste
4220: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d  r..**.** If no m
4230: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
4240: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
4250: 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20  nt *pzMaster is 
4260: 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
4270: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
4280: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
4290: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
42a0: 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e  nal(OsFile *pJrn
42b0: 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74  l, char **pzMast
42c0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
42d0: 20 75 33 32 20 6c 65 6e 3b 0a 20 20 6f 66 66 5f   u32 len;.  off_
42e0: 74 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  t szJ;.  u32 cks
42f0: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
4300: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
4310: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
4320: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
4330: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
4340: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30  .  *pzMaster = 0
4350: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
4360: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
4370: 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  l, &szJ);.  if( 
4380: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
4390: 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e   szJ<16 ) return
43a0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
43b0: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
43c0: 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28  , szJ-16);.  if(
43d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
43e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20   return rc;. .  
43f0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
4400: 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20  pJrnl, &len);.  
4410: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4420: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
4430: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
4440: 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29  s(pJrnl, &cksum)
4450: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
4460: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
4470: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
4480: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
4490: 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66  aMagic, 8);.  if
44a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
44b0: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
44c0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
44d0: 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b   8) ) return rc;
44e0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
44f0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
4500: 4a 2d 31 32 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-12-len);.  if(
4510: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4520: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a   return rc;..  *
4530: 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72  pzMaster = (char
4540: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
4550: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a  len);.  if( !*pz
4560: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
4570: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
4580: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
4590: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
45a0: 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65  l, *pzMaster, le
45b0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
45c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
45d0: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
45e0: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
45f0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ter = 0;.    ret
4600: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
4610: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
4620: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
4630: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
4640: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69   name */.  for(i
4650: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
4660: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 2a 70  .    cksum -= *p
4670: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
4680: 20 20 69 66 28 20 21 63 6b 73 75 6d 20 29 7b 0a    if( !cksum ){.
4690: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
46a0: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
46b0: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
46c0: 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  }.   .  return S
46d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
46e0: 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  ** Seek the jour
46f0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
4700: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
4710: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
4720: 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e  where a.** journ
4730: 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65  al header may be
4740: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
4750: 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  . Pager.journalO
4760: 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ff is updated wi
4770: 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65  th.** the new se
4780: 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a  ek offset..**.**
4790: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
47a0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
47b0: 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65  *.** Input Offse
47c0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  t              O
47d0: 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20  utput Offset.** 
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20  -------.** 0    
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20       0.** 512   
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20      512.** 100  
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30       512.** 2000
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
4890: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
48a0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  kJournalHdr(Page
48b0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f 66  r *pPager){.  of
48c0: 66 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  f_t offset = 0;.
48d0: 20 20 6f 66 66 5f 74 20 63 20 3d 20 70 50 61 67    off_t c = pPag
48e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
48f0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
4900: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
4910: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
4920: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
4930: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
4940: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
4950: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
4960: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4970: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
4980: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
4990: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
49a0: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
49b0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  Z(pPager) );.  p
49c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
49d0: 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65  f = offset;.  re
49e0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65  turn sqlite3OsSe
49f0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
4a00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
4a10: 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Off);.}../*.** T
4a20: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4a30: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
4a40: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
4a50: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
4a60: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
4a70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
4a80: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
4a90: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
4aa0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
4ab0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
4ac0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
4ad0: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
4ae0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
4af0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
4b00: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
4b10: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
4b20: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
4b30: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
4b40: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
4b50: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
4b60: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
4b70: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
4b80: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
4b90: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
4ba0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
4bb0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
4bc0: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
4bd0: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
4be0: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
4bf0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
4c00: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
4c10: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
4c20: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
4c30: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
4c40: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
4c50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4c60: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
4c70: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
4c80: 20 20 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a    int rc = seekJ
4c90: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
4ca0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
4cb0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67  turn rc;..  pPag
4cc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
4cd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
4ce0: 4f 66 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65  Off;.  if( pPage
4cf0: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30  r->stmtHdrOff==0
4d00: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
4d10: 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61  stmtHdrOff = pPa
4d20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b  ger->journalHdr;
4d30: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
4d40: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
4d50: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
4d60: 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d  er);..  /* FIX M
4d70: 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f  E: .  **.  ** Po
4d80: 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67  ssibly for a pag
4d90: 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  er not in no-syn
4da0: 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
4db0: 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64  nal magic should
4dc0: 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69   not.  ** be wri
4dd0: 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20  tten until nRec 
4de0: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  is filled in as 
4df0: 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e  part of next syn
4e00: 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a  cJournal(). .  *
4e10: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20  *.  ** Actually 
4e20: 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20  maybe the whole 
4e30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
4e40: 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64  hould be delayed
4e50: 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a   until that.  **
4e60: 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62   point. Think ab
4e70: 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  out this..  */. 
4e80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
4e90: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
4ea0: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
4eb0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
4ec0: 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 69 66 28  lMagic));..  if(
4ed0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4ee0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 52 65  {.    /* The nRe
4ef0: 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46  c Field. 0xFFFFF
4f00: 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20  FFF for no-sync 
4f10: 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 20  journals. */.   
4f20: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
4f30: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
4f40: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
4f50: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29   0xffffffff : 0)
4f60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
4f70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4f80: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
4f90: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
4fa0: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20 20 73 71  liser */ .    sq
4fb0: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
4fc0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
4fd0: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
4fe0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
4ff0: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
5000: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5010: 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  d, pPager->cksum
5020: 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Init);.  }.  if(
5030: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5040: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 69  {.    /* The ini
5050: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
5060: 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77  ze */.    rc = w
5070: 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
5080: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
5090: 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  >dbSize);.  }.  
50a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
50b0: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  K ){.    /* The 
50c0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
50d0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
50e0: 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  cess */.    rc =
50f0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
5100: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
5110: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
5120: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f    }..  /* The jo
5130: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
5140: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75   been written su
5150: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b  ccessfully. Seek
5160: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
5170: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
5180: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
5190: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
51a0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a  er sector..  */.
51b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
51c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
51d0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
51e0: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
51f0: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20  ournalOff-1);.  
5200: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5210: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
5220: 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a  fd, "\000", 1);.
5230: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
5250: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
5260: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
5270: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
5280: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
5290: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
52a0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
52b0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
52c0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
52d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
52e0: 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65   file. See comme
52f0: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
5300: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
5310: 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72  dr() for a descr
5320: 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  iption of.** the
5330: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5340: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
5350: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
5360: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
5370: 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74  , *nRec is set t
5380: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
5390: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
53a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
53b0: 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a  eader and *dbSiz
53c0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
53d0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
53e0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
53f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
5400: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
5410: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
5420: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
5430: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
5440: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
5450: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
5460: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
5470: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
5480: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
5490: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
54a0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
54b0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
54c0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
54d0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52  returned and *nR
54e0: 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61  ec and *dbSize a
54f0: 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20  re not set.  If 
5500: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
5510: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
5520: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
5530: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
5540: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
5550: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
5560: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
5570: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
5580: 50 61 67 65 72 2c 20 0a 20 20 6f 66 66 5f 74 20  Pager, .  off_t 
5590: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
55a0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
55b0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
55c0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
55d0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
55e0: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
55f0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
5600: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
5610: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5620: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5630: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5640: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
5650: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
5660: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5670: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
5680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5690: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
56a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
56b0: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a 66  Read(&pPager->jf
56c0: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
56d0: 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66  f(aMagic));.  if
56e0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
56f0: 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  ;..  if( memcmp(
5700: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
5710: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
5720: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
5730: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
5740: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ONE;.  }..  rc =
5750: 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61   read32bits(&pPa
5760: 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29  ger->jfd, pNRec)
5770: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
5780: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5790: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
57a0: 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
57b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
57c0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
57d0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
57e0: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
57f0: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
5800: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
5810: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
5820: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
5830: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
5840: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
5850: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
5860: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
5870: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
5880: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
5890: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
58a0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
58b0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
58c0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
58d0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
58e0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
58f0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
5900: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
5910: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
5920: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
5930: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
5940: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
5950: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
5960: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
5970: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
5980: 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e  (u32 *)&pPager->
5990: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
59a0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
59b0: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
59c0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
59d0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
59e0: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
59f0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
5a00: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
5a10: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65  ournalOff);.  re
5a20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
5a30: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
5a40: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
5a50: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
5a60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5a70: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
5a80: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
5a90: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
5aa0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5ab0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
5ac0: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
5ad0: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
5ae0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
5af0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
5b00: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
5b10: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
5b20: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
5b30: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
5b40: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
5b50: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
5b60: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
5b70: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
5b80: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
5b90: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
5ba0: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
5bb0: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
5bc0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
5bd0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
5be0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
5bf0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5c00: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
5c10: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
5c20: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
5c30: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
5c40: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
5c50: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
5c60: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
5c70: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
5c80: 6c 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  l name..*/.stati
5c90: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
5ca0: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
5cb0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
5cc0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
5cd0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
5ce0: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
5cf0: 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 0a  u32 cksum = 0; .
5d00: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
5d10: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
5d20: 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c  ster) return SQL
5d30: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
5d40: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
5d50: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
5d60: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72  (zMaster);.  for
5d70: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
5d80: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
5d90: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
5da0: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
5db0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
5dc0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
5dd0: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
5de0: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
5df0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
5e00: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
5e10: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
5e20: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
5e30: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
5e40: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
5e50: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
5e60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
5e70: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
5e80: 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72     rc = seekJour
5e90: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
5ea0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
5eb0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5ec0: 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
5ed0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
5ee0: 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d  len+20);..  rc =
5ef0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
5f00: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
5f10: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
5f20: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5f30: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5f40: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
5f50: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
5f60: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
5f70: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
5f80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5f90: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
5fa0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
5fb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65 6e 29 3b  ager->jfd, len);
5fc0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5fd0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
5fe0: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
5ff0: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6000: 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66  fd, cksum);.  if
6010: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6020: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6030: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
6040: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
6050: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6060: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
6070: 4d 61 67 69 63 29 29 3b 0a 20 20 72 65 74 75 72  Magic));.  retur
6080: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
6090: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70  dd or remove a p
60a0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  age from the lis
60b0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74  t of all pages t
60c0: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a  hat are in the.*
60d0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
60e0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
60f0: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
6100: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
6110: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
6120: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
6130: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
6140: 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  al.  This helps 
6150: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
6160: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a  _stmt_commit().*
6170: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
6180: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
6190: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
61a0: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
61b0: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
61c0: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
61d0: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
61e0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
61f0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
6200: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
6210: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
6220: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
6230: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
6240: 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  er;.  if( pPg->i
6250: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
6260: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
6270: 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70  PrevStmt==0 && p
6280: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  Pg->pNextStmt==0
6290: 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   );.  pPg->pPrev
62a0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
62b0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b  pPager->pStmt ){
62c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
62d0: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
62e0: 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
62f0: 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67  pNextStmt = pPag
6300: 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61  er->pStmt;.  pPa
6310: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
6320: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
6330: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
6340: 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66  id page_remove_f
6350: 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  rom_stmt_list(Pg
6360: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
6370: 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20   !pPg->inStmt ) 
6380: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
6390: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a  g->pPrevStmt ){.
63a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
63b0: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
63c0: 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  tStmt==pPg );.  
63d0: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
63e0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
63f0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
6400: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6410: 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
6420: 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pStmt==pPg );.  
6430: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
6440: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
6450: 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28  tStmt;.  }.  if(
6460: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
6470: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6480: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
6490: 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b  PrevStmt==pPg );
64a0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53  .    pPg->pNextS
64b0: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
64c0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b   pPg->pPrevStmt;
64d0: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
64e0: 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  tStmt = 0;.  pPg
64f0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
6500: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
6510: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
6520: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
6530: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
6540: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
6550: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
6560: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
6570: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
6580: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
6590: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
65a0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
65b0: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
65c0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70  {.  PgHdr *p = p
65d0: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67  Pager->aHash[pag
65e0: 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a  er_hash(pgno)];.
65f0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
6600: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
6610: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
6620: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
6630: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
6640: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
6650: 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20  e and clear the 
6660: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
6670: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
6680: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
6690: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
66a0: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
66b0: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
66c0: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
66d0: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
66e0: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
66f0: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
6700: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
6710: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
6720: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
6730: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
6740: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
6750: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
6760: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
6770: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
6780: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  , *pNext;.  for(
6790: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
67a0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
67b0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
67c0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
67d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
67e0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
67f0: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
6800: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
6810: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
6820: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
6830: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
6840: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
6850: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
6860: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
6870: 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  h));.  pPager->n
6880: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
6890: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
68a0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
68b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
68c0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
68d0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
68e0: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
68f0: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
6900: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
6910: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
6920: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
6930: 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72  e = -1;.  pPager
6940: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73  ->nRef = 0;.  as
6950: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
6960: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
6970: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
6980: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
6990: 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
69a0: 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  has the journal 
69b0: 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a  file open and.**
69c0: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
69d0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
69e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
69f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c  This routine rel
6a00: 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  eases.** the dat
6a10: 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61  abase lock and a
6a20: 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44  cquires a SHARED
6a30: 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61   lock in its pla
6a40: 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ce.  The journal
6a50: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c 65  .** file is dele
6a60: 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a  ted and closed..
6a70: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73  **.** TODO: Cons
6a80: 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65  ider keeping the
6a90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
6aa0: 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  en for temporary
6ab0: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54   databases..** T
6ac0: 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61  his might give a
6ad0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
6ae0: 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64  rovement on wind
6af0: 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e  ows where openin
6b00: 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61  g.** a file is a
6b10: 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  n expensive oper
6b20: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
6b30: 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69   int pager_unwri
6b40: 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  telock(Pager *pP
6b50: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
6b60: 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 21  pPg;.  assert( !
6b70: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b  pPager->memDb );
6b80: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
6b90: 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
6ba0: 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
6bb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6bc0: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
6bd0: 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
6be0: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
6bf0: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
6c00: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
6c10: 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  e(&pPager->stfd)
6c20: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
6c30: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
6c40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
6c50: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
6c60: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
6c70: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
6c80: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
6c90: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
6ca0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
6cb0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
6cc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
6cd0: 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  e( pPager->aInJo
6ce0: 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
6cf0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
6d00: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  = 0;.    for(pPg
6d10: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
6d20: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
6d30: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
6d40: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
6d50: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
6d60: 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
6d70: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
6d80: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
6d90: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
6da0: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
6db0: 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Rec = 0;.  }else
6dc0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
6dd0: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
6de0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75  ==0 || pPager->u
6df0: 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  seJournal==0 );.
6e00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55    }.  sqlite3OsU
6e10: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
6e20: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
6e30: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
6e40: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
6e50: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
6e60: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  bSize = 0;.  pPa
6e70: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
6e80: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
6e90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6ea0: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
6eb0: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66  urn a checksum f
6ec0: 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64  or the page of d
6ed0: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ata..**.** This 
6ee0: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
6ef0: 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72  ecksum.  It is r
6f00: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
6f10: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
6f20: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
6f30: 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ue and the page 
6f40: 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65  number.  We expe
6f50: 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a  rimented with.**
6f60: 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74   a checksum of t
6f70: 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20  he entire data, 
6f80: 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75  but that was fou
6f90: 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f  nd to be too slo
6fa0: 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  w..**.** Note th
6fb0: 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
6fc0: 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  er is stored at 
6fd0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
6fe0: 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65   data and.** the
6ff0: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f   checksum is sto
7000: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  red at the end. 
7010: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
7020: 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a  nt.  If journal.
7030: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  ** corruption oc
7040: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
7050: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
7060: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65   most likely sce
7070: 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74  nario.** is that
7080: 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
7090: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
70a0: 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
70b0: 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d  ged.  It is.** m
70c0: 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
70d0: 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
70e0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
70f0: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
7100: 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
7110: 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
7120: 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
7130: 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
7140: 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
7150: 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
7160: 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
7170: 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
7180: 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a  f corruption..**
7190: 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e  .** FIX ME:  Con
71a0: 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65  sider adding eve
71b0: 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29  ry 200th (or so)
71c0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74   byte of the dat
71d0: 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63  a to the.** chec
71e0: 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20  ksum.  That way 
71f0: 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
7200: 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65   spans 3 or more
7210: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e   disk sectors an
7220: 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69  d.** only the mi
7230: 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63  ddle sector is c
7240: 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20  orrupt, we will 
7250: 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61  still have a rea
7260: 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63  sonable.** chanc
7270: 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65  e of failing the
7280: 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68   checksum and th
7290: 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65  us detecting the
72a0: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61   problem..*/.sta
72b0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
72c0: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
72d0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f  r, Pgno pgno, co
72e0: 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74 61 29  nst char *aData)
72f0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
7300: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
7310: 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  t;.  int i = pPa
7320: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
7330: 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  0;.  while( i>0 
7340: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
7350: 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
7360: 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
7370: 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
7380: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
7390: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  le page from the
73a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
73b0: 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73  ened on file des
73c0: 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20  criptor.** jfd. 
73d0: 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f   Playback this o
73e0: 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  ne page..**.** I
73f0: 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74  f useCksum==0 it
7400: 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72   means this jour
7410: 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  nal does not use
7420: 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65   checksums.  Che
7430: 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f  cksums.** are no
7440: 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d  t used in statem
7450: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63  ent journals bec
7460: 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a  ause statement j
7470: 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a  ournals do not.*
7480: 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76  * need to surviv
7490: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  e power failures
74a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
74b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
74c0: 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70  ne_page(Pager *p
74d0: 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a  Pager, OsFile *j
74e0: 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d  fd, int useCksum
74f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
7500: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7520: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
7530: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
7540: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7560: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
7570: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
7580: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
7590: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75b0: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
75c0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
75d0: 20 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53   */.  u8 aData[S
75e0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d  QLITE_PAGE_SIZE]
75f0: 3b 20 20 20 2f 2a 20 53 74 6f 72 65 20 64 61 74  ;   /* Store dat
7600: 61 20 68 65 72 65 20 2a 2f 0a 0a 20 20 72 63 20  a here */..  rc 
7610: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
7620: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
7630: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7640: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
7650: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
7660: 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70 50 61  jfd, &aData, pPa
7670: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
7680: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7690: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
76a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
76b0: 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
76c0: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a  >pageSize + 4;..
76d0: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
76e0: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
76f0: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
7700: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
7710: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
7720: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
7730: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
7740: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
7750: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
7760: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
7770: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
7780: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
7790: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
77a0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
77b0: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
77c0: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
77d0: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
77e0: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
77f0: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
7800: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
7810: 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
7820: 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
7830: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7840: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
7850: 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64  ( pgno>(unsigned
7860: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
7870: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7880: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
7890: 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20  f( useCksum ){. 
78a0: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
78b0: 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b  ts(jfd, &cksum);
78c0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
78d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
78e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
78f0: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
7900: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
7910: 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 21 3d  , pgno, aData)!=
7920: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
7930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
7940: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
7950: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
7960: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
7970: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
7980: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
7990: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
79a0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
79b0: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
79c0: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
79d0: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
79e0: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
79f0: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
7a00: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
7a10: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
7a20: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
7a30: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
7a40: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
7a50: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
7a60: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
7a70: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
7a80: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
7a90: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
7aa0: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
7ab0: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
7ac0: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
7ad0: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
7ae0: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
7af0: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
7b00: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
7b10: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
7b20: 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
7b30: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
7b40: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
7b50: 7c 7c 20 70 50 67 20 29 3b 0a 20 20 54 52 41 43  || pPg );.  TRAC
7b60: 45 32 28 22 50 4c 41 59 42 41 43 4b 20 70 61 67  E2("PLAYBACK pag
7b70: 65 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a  e %d\n", pgno);.
7b80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7b90: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
7ba0: 53 49 56 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  SIVE ){.    sqli
7bb0: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
7bc0: 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
7bd0: 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41  (off_t)SQLITE_PA
7be0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 72 63  GE_SIZE);.    rc
7bf0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7c00: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 61  e(&pPager->fd, a
7c10: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47  Data, SQLITE_PAG
7c20: 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 69  E_SIZE);.  }.  i
7c30: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
7c40: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
7c50: 65 76 65 72 20 62 65 20 72 6f 6c 6c 65 64 20 62  ever be rolled b
7c60: 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
7c70: 73 65 2c 20 65 78 63 65 70 74 20 66 6f 72 20 70  se, except for p
7c80: 61 67 65 0a 20 20 20 20 2a 2a 20 31 20 77 68 69  age.    ** 1 whi
7c90: 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
7ca0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
7cb0: 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
7cc0: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
7cd0: 2a 2a 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a  ** active..    *
7ce0: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
7cf0: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
7d00: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
7d10: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20  Pg->pgno==1 );. 
7d20: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
7d30: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
7d40: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
7d50: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
7d60: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
7d70: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
7d80: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
7d90: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
7da0: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
7db0: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
7dc0: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
7dd0: 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
7de0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
7df0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
7e00: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
7e10: 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
7e20: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
7e30: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
7e40: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
7e50: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
7e60: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
7e70: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
7e80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7e90: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
7ea0: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
7eb0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
7ec0: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
7ed0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
7ee0: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
7ef0: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
7f00: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
7f10: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
7f20: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
7f30: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
7f40: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
7f50: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
7f60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
7f70: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
7f80: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
7f90: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
7fa0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
7fb0: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
7fc0: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
7fd0: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
7fe0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
7ff0: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
8000: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
8010: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
8020: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
8030: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
8040: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
8050: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
8060: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
8070: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
8080: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
8090: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
80a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
80b0: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
80c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61  (const char *zMa
80d0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
80e0: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
80f0: 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65  en = 0;.  OsFile
8100: 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20   master;.  char 
8110: 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
8120: 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
8130: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
8140: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 6f 66 66  al file */.  off
8150: 5f 74 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  _t nMasterJourna
8160: 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  l;     /* Size o
8170: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
8180: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   file */..  /* O
8190: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
81a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c  ournal file excl
81b0: 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20  usively in case 
81c0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
81d0: 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69  ss.  ** is runni
81e0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
81f0: 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69  also. Not that i
8200: 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68  t makes too much
8210: 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a   difference..  *
8220: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61 73 74  /.  memset(&mast
8230: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61  er, 0, sizeof(ma
8240: 73 74 65 72 29 29 3b 0a 20 20 72 63 20 3d 20 73  ster));.  rc = s
8250: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
8260: 75 73 69 76 65 28 7a 4d 61 73 74 65 72 2c 20 26  usive(zMaster, &
8270: 6d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 69 66  master, 0);.  if
8280: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8290: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
82a0: 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f  _out;.  master_o
82b0: 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20  pen = 1;.  rc = 
82c0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
82d0: 65 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(&master, &nMas
82e0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
82f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8300: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
8310: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
8320: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
8330: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
8340: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
8350: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
8360: 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
8370: 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
8380: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
8390: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
83a0: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69  from.    ** sqli
83b0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  teMalloc() and p
83c0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
83d0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
83e0: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
83f0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
8400: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  *)sqliteMalloc(n
8410: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
8420: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
8430: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
8440: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
8450: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  EM;.      goto d
8460: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
8470: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
8480: 69 74 65 33 4f 73 52 65 61 64 28 26 6d 61 73 74  ite3OsRead(&mast
8490: 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
84a0: 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al, nMasterJourn
84b0: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  al);.    if( rc!
84c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
84d0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
84e0: 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  ..    zJournal =
84f0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
8500: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  .    while( (zJo
8510: 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
8520: 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
8530: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  rnal ){.      if
8540: 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
8550: 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20  xists(zJournal) 
8560: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
8570: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
8580: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
8590: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
85a0: 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
85b0: 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
85c0: 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
85d0: 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
85e0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
85f0: 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65         ** so, re
8600: 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
8610: 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
8620: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
8630: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8640: 20 20 4f 73 46 69 6c 65 20 6a 6f 75 72 6e 61 6c    OsFile journal
8650: 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ;..        memse
8660: 74 28 26 6a 6f 75 72 6e 61 6c 2c 20 30 2c 20 73  t(&journal, 0, s
8670: 69 7a 65 6f 66 28 6a 6f 75 72 6e 61 6c 29 29 3b  izeof(journal));
8680: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
8690: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
86a0: 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a  nly(zJournal, &j
86b0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
86c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
86d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
86e0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
86f0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
8700: 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
8710: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26 6a  MasterJournal(&j
8720: 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72  ournal, &zMaster
8730: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Ptr);.        sq
8740: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f  lite3OsClose(&jo
8750: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
8760: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8770: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
8780: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
8790: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
87a0: 20 20 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65        if( zMaste
87b0: 72 50 74 72 20 26 26 20 21 73 74 72 63 6d 70 28  rPtr && !strcmp(
87c0: 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
87d0: 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ter) ){.        
87e0: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
87f0: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
8800: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
8810: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
8820: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
8830: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
8840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8850: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
8860: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
8870: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
8880: 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73  }.  .  sqlite3Os
8890: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
88a0: 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
88b0: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
88c0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
88d0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a  iteFree(zMasterJ
88e0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
88f0: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
8900: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
8910: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
8920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
8940: 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
8950: 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69  e cache agree wi
8960: 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
8970: 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  sk.  In other wo
8980: 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74  rds,.** reread t
8990: 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74  he disk to reset
89a0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
89b0: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
89c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
89d0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f  alled after a ro
89e0: 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20  llback in which 
89f0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74  some of the dirt
8a00: 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73  y cache.** pages
8a10: 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20   had never been 
8a20: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64  written out to d
8a30: 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  isk.  We need to
8a40: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a   roll back the.*
8a50: 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20  * cache content 
8a60: 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20  and the easiest 
8a70: 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69  way to do that i
8a80: 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  s to reread the 
8a90: 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62  old content.** b
8aa0: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ack from the dis
8ab0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
8ac0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
8ad0: 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
8ae0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
8af0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
8b00: 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50  ITE_OK;.  for(pP
8b10: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
8b20: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
8b30: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61  extAll){.    cha
8b40: 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 50 41  r zBuf[SQLITE_PA
8b50: 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66  GE_SIZE];.    if
8b60: 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20  ( !pPg->dirty ) 
8b70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8b80: 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
8b90: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
8ba0: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
8bb0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
8bc0: 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
8bd0: 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66  E_PAGE_SIZE*(off
8be0: 5f 74 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  _t)(pPg->pgno-1)
8bf0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
8c00: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
8c10: 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 53  ger->fd, zBuf, S
8c20: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
8c30: 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  ;.      TRACE2("
8c40: 52 45 46 45 54 43 48 20 70 61 67 65 20 25 64 5c  REFETCH page %d\
8c50: 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  n", pPg->pgno);.
8c60: 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
8c70: 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70  er, zBuf, pPg->p
8c80: 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20 69  gno, 2);.      i
8c90: 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
8ca0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8cb0: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
8cc0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
8cd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8ce0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
8cf0: 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47   memcmp(zBuf, PG
8d00: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
8d10: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
8d20: 5a 45 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ZE) ){.      mem
8d30: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
8d40: 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 53 51  A(pPg), zBuf, SQ
8d50: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
8d60: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
8d70: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
8d80: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
8d90: 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f  xReiniter(PGHDR_
8da0: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
8db0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
8dc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8dd0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
8de0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29  DR_TO_EXTRA(pPg)
8df0: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
8e00: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra);.      }.  
8e10: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65    }.    pPg->nee
8e20: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
8e30: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
8e40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
8e60: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
8e70: 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
8e80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8e90: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
8ea0: 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
8eb0: 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
8ec0: 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
8ed0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8ee0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
8ef0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
8f00: 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
8f10: 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
8f20: 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
8f30: 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
8f40: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
8f50: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
8f60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
8f70: 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
8f80: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
8f90: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
8fa0: 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
8fb0: 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
8fc0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
8fd0: 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
8fe0: 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
8ff0: 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
9000: 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
9010: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
9020: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
9030: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
9040: 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
9050: 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
9060: 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
9070: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
9080: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9090: 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
90a0: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
90b0: 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
90c0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
90d0: 20 20 28 35 29 20 20 34 20 62 79 74 65 20 69 6e    (5)  4 byte in
90e0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
90f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
9100: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
9110: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
9120: 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c    name.  The val
9130: 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28  ue may be zero (
9140: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
9150: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
9160: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
9170: 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62  l.).**  (6)  N b
9180: 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ytes of the mast
9190: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
91a0: 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20    The name will 
91b0: 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  be nul-terminate
91c0: 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d  d.**       and m
91d0: 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72 20  ight be shorter 
91e0: 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72  than the value r
91f0: 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49  ead from (5).  I
9200: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
9210: 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65  .**       of the
9220: 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68   name is \000 th
9230: 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  en there is no m
9240: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20  aster journal.  
9250: 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20  The master.**   
9260: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65      journal name
9270: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54   is stored in UT
9280: 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65  F-8..**  (7)  Ze
9290: 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
92a0: 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
92b0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
92c0: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
92d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
92e0: 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
92f0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
9300: 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
9310: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
9320: 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
9330: 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
9340: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9350: 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
9360: 69 72 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f  irst 6 items abo
9370: 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
9380: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
9390: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
93a0: 6f 66 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e  of the 7th item.
93b0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
93c0: 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
93d0: 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
93e0: 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
93f0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
9400: 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
9410: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
9420: 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
9430: 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
9440: 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
9450: 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
9460: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
9470: 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
9480: 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
9490: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
94a0: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
94b0: 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
94c0: 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
94d0: 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
94e0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
94f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
9500: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
9510: 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
9520: 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
9530: 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
9540: 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
9550: 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
9560: 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
9570: 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
9580: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
9590: 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
95a0: 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
95b0: 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
95c0: 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
95d0: 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
95e0: 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
95f0: 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
9600: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
9610: 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
9620: 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
9630: 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
9640: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
9650: 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
9660: 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
9670: 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
9680: 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
9690: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
96a0: 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
96b0: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
96c0: 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
96d0: 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
96e0: 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
96f0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
9700: 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
9710: 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
9720: 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
9730: 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
9740: 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
9750: 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
9760: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
9770: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
9780: 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
9790: 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
97a0: 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
97b0: 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
97c0: 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
97d0: 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
97e0: 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
97f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
9800: 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
9810: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
9820: 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
9830: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
9840: 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
9850: 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
9860: 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
9870: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
9880: 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
9890: 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
98a0: 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
98b0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
98c0: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
98d0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
98e0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
98f0: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
9900: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
9910: 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20  ){.  off_t szJ; 
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9930: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
9940: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
9950: 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
9960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9970: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
9980: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
9990: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rnal */.  int i;
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
99c0: 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
99d0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
99e0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
99f0: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
9a00: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
9a10: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
9a20: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
9a30: 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
9a40: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
9a50: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
9a60: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
9a70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9a80: 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a   if any */..  /*
9a90: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
9aa0: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
9ab0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
9ac0: 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
9ad0: 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
9ae0: 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
9af0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9b00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
9b10: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9b20: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
9b30: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
9b40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9b50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
9b60: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
9b70: 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
9b80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9b90: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
9ba0: 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
9bb0: 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
9bc0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
9bd0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
9be0: 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
9bf0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
9c00: 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
9c10: 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
9c20: 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
9c30: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
9c40: 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
9c50: 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
9c60: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
9c70: 4a 6f 75 72 6e 61 6c 28 26 70 50 61 67 65 72 2d  Journal(&pPager-
9c80: 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b  >jfd, &zMaster);
9c90: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
9ca0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
9cb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9cc0: 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26  K || (zMaster &&
9cd0: 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45   !sqlite3OsFileE
9ce0: 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20  xists(zMaster)) 
9cf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
9d00: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
9d10: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
9d20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9d30: 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
9d40: 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
9d50: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
9d60: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  }.  sqlite3OsSee
9d70: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
9d80: 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  0);.  pPager->jo
9d90: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
9da0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
9db0: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
9dc0: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
9dd0: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
9de0: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
9df0: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
9e00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
9e10: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
9e20: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
9e30: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
9e40: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
9e50: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
9e60: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
9e70: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
9e80: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
9e90: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
9ea0: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
9eb0: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
9ec0: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
9ed0: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
9ee0: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
9ef0: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
9f00: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
9f10: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
9f20: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
9f30: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
9f40: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
9f50: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
9f60: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
9f70: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
9f80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
9f90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
9fa0: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
9fb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
9fc0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
9fd0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
9fe0: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
9ff0: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
a000: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
a010: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
a020: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
a030: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
a040: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
a050: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
a060: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
a070: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
a080: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
a090: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
a0a0: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
a0b0: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
a0c0: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
a0d0: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
a0e0: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
a0f0: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
a100: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
a110: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
a120: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a130: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
a140: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
a150: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
a160: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
a170: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
a180: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
a190: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
a1a0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
a1b0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
a1c0: 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
a1d0: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
a1e0: 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
a1f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
a200: 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69  ck to it's origi
a210: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
a220: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
a230: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
a240: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
a250: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
a260: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
a270: 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50  gDbSize==0 || pP
a280: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
a290: 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20  ==mxPg );.      
a2a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
a2b0: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
a2c0: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
a2d0: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67  SIZE*(off_t)mxPg
a2e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
a2f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a300: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
a310: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
a320: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
a330: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
a340: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20 3d    }..    /* rc =
a350: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
a360: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55  pPager->jfd, JOU
a370: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
a380: 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28  er)); */.    if(
a390: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a3a0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
a3b0: 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f  ck;.  .    /* Co
a3c0: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
a3d0: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
a3e0: 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
a3f0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
a400: 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
a410: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63   for(i=0; i<nRec
a420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
a430: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
a440: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
a450: 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  r, &pPager->jfd,
a460: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
a470: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a480: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
a490: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
a4a0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
a4b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
a4c0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
a4d0: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
a4e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a4f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a500: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
a510: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
a520: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a530: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65  }.  }..  /* Page
a540: 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
a550: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
a560: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65  journal but neve
a570: 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68  r synced.  ** wh
a580: 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64  ere not restored
a590: 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f   by the loop abo
a5a0: 76 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ve.  We have to 
a5b0: 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20  restore those.  
a5c0: 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65 61 64  ** pages by read
a5d0: 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72  ing them back fr
a5e0: 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
a5f0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
a600: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
a610: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65  ITE_OK );.  page
a620: 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
a630: 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61  Pager);..end_pla
a640: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 7a 4d 61  yback:.  if( zMa
a650: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
a660: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
a670: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
a680: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
a690: 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a  ll return true,.
a6a0: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
a6b0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
a6c0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
a6d0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 65 72  r journal. If er
a6e0: 72 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f 63 63  rors .    ** occ
a6f0: 75 72 20 64 75 72 69 6e 67 20 74 68 69 73 20 70  ur during this p
a700: 72 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65 20 74  rocess, ignore t
a710: 68 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  hem..    */.    
a720: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a730: 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
a740: 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74  _delmaster(zMast
a750: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
a760: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
a770: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
a780: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a790: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
a7a0: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
a7b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
a7c0: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
a7d0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
a7e0: 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
a7f0: 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
a800: 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
a810: 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
a820: 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
a830: 69 66 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53  ifferent PAGER_S
a840: 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20  ECTOR_SIZE.  ** 
a850: 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
a860: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
a870: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
a880: 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50  ocess..  */.  pP
a890: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
a8a0: 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f   = PAGER_SECTOR_
a8b0: 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 72  SIZE;.  return r
a8c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
a8d0: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
a8e0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
a8f0: 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
a900: 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
a910: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
a920: 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
a930: 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
a940: 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
a950: 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
a960: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
a970: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
a980: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
a990: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
a9a0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f  statement is sto
a9b0: 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73  red in pPager->s
a9c0: 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  tmtSize, not in 
a9d0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
a9e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
a9f0: 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
aa00: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
aa10: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
aa20: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
aa30: 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
aa40: 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
aa50: 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
aa60: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
aa70: 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
aa80: 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
aa90: 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  t pPager->stmtJS
aaa0: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
aab0: 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c  nt pager_stmt_pl
aac0: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
aad0: 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73  ager){.  off_t s
aae0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
aaf0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
ab00: 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
ab10: 0a 20 20 6f 66 66 5f 74 20 68 64 72 4f 66 66 3b  .  off_t hdrOff;
ab20: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ab40: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
ab50: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab70: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
ab80: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
ab90: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
aba0: 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66  rnalOff;.#ifndef
abb0: 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20   NDEBUG .  {.   
abc0: 20 6f 66 66 5f 74 20 6f 73 5f 73 7a 4a 3b 0a 20   off_t os_szJ;. 
abd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
abe0: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
abf0: 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29  r->jfd, &os_szJ)
ac00: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
ac10: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
ac20: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
ac30: 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a   szJ==os_szJ );.
ac40: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
ac50: 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62   Set hdrOff to b
ac60: 65 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  e the offset to 
ac70: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
ac80: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
ac90: 0a 20 20 2a 2a 20 74 68 69 73 20 73 74 61 74 65  .  ** this state
aca0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
acb0: 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20  , or the end of 
acc0: 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a  the file if no j
acd0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64  ournal.  ** head
ace0: 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a  er was written..
acf0: 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20    */.  hdrOff = 
ad00: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
ad10: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ff;.  assert( pP
ad20: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c  ager->fullSync |
ad30: 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69  | !hdrOff );.  i
ad40: 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20  f( !hdrOff ){.  
ad50: 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a    hdrOff = szJ;.
ad60: 20 20 7d 0a 20 20 0a 0a 20 20 2f 2a 20 54 72 75    }.  ..  /* Tru
ad70: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
ad80: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
ad90: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
ada0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
adb0: 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  3OsTruncate(&pPa
adc0: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
add0: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
ade0: 29 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  )pPager->stmtSiz
adf0: 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  e);.  pPager->db
ae00: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
ae10: 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46  tmtSize;..  /* F
ae20: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
ae30: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
ae40: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
ae50: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
ae60: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ae70: 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
ae80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
ae90: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
aea0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66  eek(&pPager->stf
aeb0: 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20  d, 0);.  nRec = 
aec0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
aed0: 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
aee0: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
aef0: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
af00: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  nt journal and b
af10: 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ack into the.  *
af20: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
af30: 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
af40: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
af50: 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d  l omits checksum
af60: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68  s from.  ** each
af70: 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f   record since po
af80: 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f  wer-failure reco
af90: 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f  very is not impo
afa0: 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65  rtant to stateme
afb0: 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73  nt.  ** journals
afc0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ..  */.  for(i=n
afd0: 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Rec-1; i>=0; i--
afe0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
aff0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
b000: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
b010: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
b020: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
b030: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
b040: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b050: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
b060: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
b070: 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c  }..  /* Now roll
b080: 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b   some pages back
b090: 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61   from the transa
b0a0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50  ction journal. P
b0b0: 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20  ager.stmtJSize. 
b0c0: 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65   ** was the size
b0d0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b0e0: 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73  file when this s
b0f0: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
b100: 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76  rted, so.  ** ev
b110: 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74  erything after t
b120: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
b130: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74  rolled back, eit
b140: 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  her into the.  *
b150: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  * database, the 
b160: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72  memory cache, or
b170: 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
b180: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65   If it is not ze
b190: 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73  ro, then Pager.s
b1a0: 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65  tmtHdrOff is the
b1b0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
b1c0: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
b1d0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
b1e0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75  eader written du
b1f0: 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d  ring this statem
b200: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
b210: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
b220: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
b230: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
b240: 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
b250: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b260: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
b270: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
b280: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
b290: 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65  urnalOff = pPage
b2a0: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20  r->stmtJSize;.  
b2b0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
b2c0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
b2d0: 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28  Cksum;.  assert(
b2e0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
b2f0: 70 50 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d  pPager)<(pPager-
b300: 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a  >pageSize+8) );.
b310: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
b320: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28  >journalOff <= (
b330: 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e  hdrOff-(pPager->
b340: 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a  pageSize+8)) ){.
b350: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
b360: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
b370: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
b380: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61  ->jfd, 1);.    a
b390: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
b3a0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
b3b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b3c0: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
b3d0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
b3e0: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
b3f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
b400: 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52 65 63   ){.    u32 nRec
b410: 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  ;.    u32 dummy;
b420: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
b430: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
b440: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75   szJ, &nRec, &du
b450: 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mmy);.    if( rc
b460: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b470: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
b480: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
b490: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
b4a0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
b4b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 63    }.    if( nRec
b4c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  ==0 ){.      nRe
b4d0: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
b4e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
b4f0: 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
b500: 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ze+8);.    }.   
b510: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
b520: 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
b530: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
b540: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
b550: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
b560: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
b570: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
b580: 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
b590: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
b5a0: 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  E );.      if( r
b5b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b5c0: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
b5d0: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
b5e0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
b5f0: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
b600: 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
b610: 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ck:.  if( rc!=SQ
b620: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
b630: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
b640: 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  = PAGER_ERR_CORR
b650: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
b660: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
b670: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
b680: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
b690: 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65  szJ;.    /* page
b6a0: 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
b6b0: 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20  Pager); */.  }. 
b6c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b6d0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
b6e0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
b6f0: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
b700: 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
b710: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  ed..**.** The ma
b720: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20  ximum number is 
b730: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
b740: 75 65 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65  ue of the mxPage
b750: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49   parameter..** I
b760: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
b770: 74 69 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63  tive, the noSync
b780: 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65   flag is also se
b790: 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73  t.  noSync bypas
b7a0: 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ses.** calls to 
b7b0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 2e  sqlite3OsSync().
b7c0: 20 20 54 68 65 20 70 61 67 65 72 20 72 75 6e 73    The pager runs
b7d0: 20 6d 75 63 68 20 66 61 73 74 65 72 20 77 69 74   much faster wit
b7e0: 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20  h noSync on,.** 
b7f0: 62 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  but if the opera
b800: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
b810: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 20  hes or there is 
b820: 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
b830: 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65  .** failure, the
b840: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
b850: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
b860: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
b870: 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61  and.** unrepaira
b880: 62 6c 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a  ble state.  .*/.
b890: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
b8a0: 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28  r_set_cachesize(
b8b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b8c0: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
b8d0: 28 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20  ( mxPage>=0 ){. 
b8e0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
b8f0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
b900: 46 69 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 50  File;.    if( pP
b910: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
b920: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
b930: 3d 20 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20  = 0; .  }else{. 
b940: 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
b950: 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78 50 61 67  c = 1;.    mxPag
b960: 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d  e = -mxPage;.  }
b970: 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30  .  if( mxPage>10
b980: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b990: 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b  mxPage = mxPage;
b9a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
b9b0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
b9c0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
b9d0: 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
b9e0: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
b9f0: 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
ba00: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
ba10: 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
ba20: 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
ba30: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
ba40: 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
ba50: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
ba60: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
ba70: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
ba80: 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
ba90: 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
baa0: 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
bab0: 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
bac0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
bad0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
bae0: 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
baf0: 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
bb00: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
bb10: 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
bb20: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
bb30: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
bb40: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
bb60: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
bb70: 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
bb80: 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
bb90: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
bba0: 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
bbb0: 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
bbc0: 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
bbd0: 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
bbe0: 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
bbf0: 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
bc00: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
bc10: 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
bc20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bc30: 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
bc40: 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
bc50: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
bc60: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
bc70: 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
bc80: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
bc90: 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
bca0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
bcb0: 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
bcc0: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
bcd0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
bce0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
bcf0: 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
bd00: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
bd10: 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
bd20: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
bd30: 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
bd40: 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
bd50: 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
bd60: 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
bd70: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
bd80: 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
bd90: 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
bda0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bdb0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
bdc0: 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
bdd0: 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
bde0: 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
bdf0: 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
be00: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
be10: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
be20: 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
be40: 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
be50: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
be60: 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
be70: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
be80: 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
be90: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
bea0: 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
beb0: 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
bec0: 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
bed0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
bee0: 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65  er_set_safety_le
bef0: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
bf00: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20  r, int level){. 
bf10: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
bf20: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
bf30: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
bf40: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
bf50: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
bf60: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
bf70: 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
bf80: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
bf90: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
bfa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
bfb0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
bfc0: 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  .  Write the nam
bfd0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  e of the file in
bfe0: 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61  to zName.** (zNa
bff0: 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  me must be at le
c000: 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ast SQLITE_TEMPN
c010: 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c  AME_SIZE bytes l
c020: 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20  ong.)  Write.** 
c030: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
c040: 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52  tor into *fd.  R
c050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
c060: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f  on success or so
c070: 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f  me.** other erro
c080: 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
c090: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20  l..**.** The OS 
c0a0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
c0b0: 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
c0c0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
c0d0: 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  n it is.** close
c0e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c0f0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
c100: 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69  entemp(char *zFi
c110: 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b  le, OsFile *fd){
c120: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a  .  int cnt = 8;.
c130: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a    int rc;.  do{.
c140: 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73      cnt--;.    s
c150: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
c160: 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  Name(zFile);.   
c170: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
c180: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69  penExclusive(zFi
c190: 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77  le, fd, 1);.  }w
c1a0: 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72  hile( cnt>0 && r
c1b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
c1c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c1d0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
c1e0: 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
c1f0: 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
c200: 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
c210: 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
c220: 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
c230: 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
c240: 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
c250: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
c260: 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
c270: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
c280: 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e  e3pager_get() an
c290: 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f  d is only held o
c2a0: 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  pen until the.**
c2b0: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
c2c0: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
c2d0: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
c2e0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
c2f0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
c300: 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
c310: 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
c320: 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
c330: 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
c340: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
c350: 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
c360: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
c370: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
c380: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
c390: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c3a0: 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61  pager_open(.  Pa
c3b0: 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
c3c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
c3d0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
c3e0: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
c3f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
c400: 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
c410: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
c420: 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
c430: 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20 20    int mxPage,   
c440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
c450: 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  x number of in-m
c460: 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
c470: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
c480: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
c490: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
c4a0: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
c4b0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
c4c0: 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
c4d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52  ,          /* TR
c4e0: 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f 6c 6c  UE to use a roll
c4f0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20  back journal on 
c500: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 76  this file */.  v
c510: 6f 69 64 20 20 2a 70 42 75 73 79 48 61 6e 64 6c  oid  *pBusyHandl
c520: 65 72 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20  er      /* Busy 
c530: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  callback */.){. 
c540: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
c550: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
c560: 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  hname = 0;.  int
c570: 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69   nameLen;.  OsFi
c580: 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 20  le fd;.  int rc 
c590: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
c5a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
c5b0: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
c5c0: 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
c5d0: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
c5e0: 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
c5f0: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
c600: 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ];..  *ppPager =
c610: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 66 64   0;.  memset(&fd
c620: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29  , 0, sizeof(fd))
c630: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
c640: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b  malloc_failed ){
c650: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c660: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
c670: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
c680: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
c690: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
c6a0: 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
c6b0: 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
c6c0: 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
c6d0: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
c6e0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
c6f0: 22 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "");.      rc = 
c700: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
c710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 46 75 6c  else{.      zFul
c720: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
c730: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
c740: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
c750: 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74      if( zFullPat
c760: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
c770: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
c780: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
c790: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
c7a0: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
c7b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
c7c0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
c7d0: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
c7e0: 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a  mp(zTemp, &fd);.
c7f0: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
c800: 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c  zTemp;.    zFull
c810: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
c820: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
c830: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
c840: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c850: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70  OK ){.      temp
c860: 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  File = 1;.    }.
c870: 20 20 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c 6c    }.  if( !zFull
c880: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
c890: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
c8a0: 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fd);.    return 
c8b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c8c0: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
c8d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
c8e0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
c8f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
c900: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
c910: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
c920: 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20    }.  nameLen = 
c930: 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68  strlen(zFullPath
c940: 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20  name);.  pPager 
c950: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
c960: 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
c970: 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30  + nameLen*3 + 30
c980: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
c990: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
c9a0: 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
c9b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
c9c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
c9d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c9e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 45  _NOMEM;.  }.  SE
c9f0: 54 5f 50 41 47 45 52 28 70 50 61 67 65 72 29 3b  T_PAGER(pPager);
ca00: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
ca10: 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
ca20: 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67  Pager[1];.  pPag
ca30: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d  er->zDirectory =
ca40: 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e   &pPager->zFilen
ca50: 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ame[nameLen+1];.
ca60: 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
ca70: 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44  al = &pPager->zD
ca80: 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e  irectory[nameLen
ca90: 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50  +1];.  strcpy(pP
caa0: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
cab0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
cac0: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
cad0: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46  ->zDirectory, zF
cae0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
caf0: 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69  for(i=nameLen; i
cb00: 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
cb10: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
cb20: 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
cb30: 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
cb40: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
cb50: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61   0;.  strcpy(pPa
cb60: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
cb70: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
cb80: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
cb90: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74  lPathname);.  st
cba0: 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  rcpy(&pPager->zJ
cbb0: 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c  ournal[nameLen],
cbc0: 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20   "-journal");.  
cbd0: 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b  pPager->fd = fd;
cbe0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
cbf0: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50  alOpen = 0;.  pP
cc00: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
cc10: 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26   = useJournal &&
cc20: 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65   !memDb;.  pPage
cc30: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
cc40: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
cc50: 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  nUse = 0;.  pPag
cc60: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
cc70: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
cc80: 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67   memDb-1;.  pPag
cc90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53  er->pageSize = S
cca0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b  QLITE_PAGE_SIZE;
ccb0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
ccc0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
ccd0: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
cce0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
ccf0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
cd00: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
cd10: 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a 20 31 30  >5 ? mxPage : 10
cd20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
cd30: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
cd40: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  ;.  pPager->errM
cd50: 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ask = 0;.  pPage
cd60: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
cd70: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
cd80: 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b  ->memDb = memDb;
cd90: 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
cda0: 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
cdb0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
cdc0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
cdd0: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
cde0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
cdf0: 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
ce00: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
ce10: 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
ce20: 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d  ?0:1);.  pPager-
ce30: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
ce40: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
ce50: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
ce60: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
ce70: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
ce80: 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65   nExtra;.  pPage
ce90: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
cea0: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
ceb0: 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  E;.  pPager->pBu
cec0: 73 79 48 61 6e 64 6c 65 72 20 3d 20 28 42 75 73  syHandler = (Bus
ced0: 79 48 61 6e 64 6c 65 72 20 2a 29 70 42 75 73 79  yHandler *)pBusy
cee0: 48 61 6e 64 6c 65 72 3b 0a 20 20 6d 65 6d 73 65  Handler;.  memse
cef0: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
cf00: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
cf10: 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70  r->aHash));.  *p
cf20: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
cf30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cf40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
cf50: 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
cf60: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
cf70: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
cf80: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
cf90: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
cfa0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
cfb0: 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
cfc0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
cfd0: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
cfe0: 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
cff0: 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
d000: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
d010: 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
d020: 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
d030: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
d040: 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
d050: 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
d060: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
d070: 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74  ose().  .** Dest
d080: 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79  ructors are only
d090: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
d0a0: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
d0b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d0c0: 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75  pager_set_destru
d0d0: 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  ctor(Pager *pPag
d0e0: 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63  er, void (*xDesc
d0f0: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20  )(void*,int)){. 
d100: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
d110: 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
d120: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
d130: 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
d140: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
d150: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
d160: 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
d170: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
d180: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
d190: 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
d1a0: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
d1b0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
d1c0: 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
d1d0: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
d1e0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
d1f0: 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
d200: 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
d210: 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
d220: 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
d230: 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
d240: 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
d250: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
d260: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
d270: 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61  _set_reiniter(Pa
d280: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
d290: 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69  d (*xReinit)(voi
d2a0: 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  d*,int)){.  pPag
d2b0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
d2c0: 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
d2d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
d2e0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
d2f0: 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
d300: 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
d310: 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a  ith.** pPager..*
d320: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
d330: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67  er_pagecount(Pag
d340: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f  er *pPager){.  o
d350: 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65 72 74  ff_t n;.  assert
d360: 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
d370: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
d380: 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65  ize>=0 ){.    re
d390: 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  turn pPager->dbS
d3a0: 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ize;.  }.  if( s
d3b0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d3c0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  (&pPager->fd, &n
d3d0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
d3e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
d3f0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
d400: 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74 75 72  _DISK;.    retur
d410: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20  n 0;.  }.  n /= 
d420: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
d430: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
d440: 3e 6d 65 6d 44 62 20 26 26 20 6e 3d 3d 50 45 4e  >memDb && n==PEN
d450: 44 49 4e 47 5f 42 59 54 45 2f 53 51 4c 49 54 45  DING_BYTE/SQLITE
d460: 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
d470: 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
d480: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
d490: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
d4a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
d4b0: 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65  ze = n;.  }.  re
d4c0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
d4d0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
d4e0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
d4f0: 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
d500: 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  ager*);.../*.** 
d510: 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72  Unlink a page fr
d520: 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
d530: 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c   (the list of al
d540: 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  l pages where nR
d550: 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72  ef==0).** and fr
d560: 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c  om its hash coll
d570: 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a  ision chain..*/.
d580: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
d590: 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  nkPage(PgHdr *pP
d5a0: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
d5b0: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
d5c0: 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68  r;..  /* Keep th
d5d0: 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20 70  e pFirstSynced p
d5e0: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20  ointer pointing 
d5f0: 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79 6e  at the first syn
d600: 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a  chronized page *
d610: 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61  /.  if( pPg==pPa
d620: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
d630: 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  d ){.    PgHdr *
d640: 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
d650: 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ee;.    while( p
d660: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
d670: 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
d680: 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65  ree; }.    pPage
d690: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
d6a0: 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = p;.  }..  /* U
d6b0: 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66  nlink from the f
d6c0: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28  reelist */.  if(
d6d0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
d6e0: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  ){.    pPg->pPre
d6f0: 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
d700: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
d710: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
d720: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d730: 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20  pFirst==pPg );. 
d740: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
d750: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
d760: 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ee;.  }.  if( pP
d770: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
d780: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
d790: 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
d7a0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
d7b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
d7c0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61  ert( pPager->pLa
d7d0: 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
d7e0: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
d7f0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
d800: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46   }.  pPg->pNextF
d810: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
d820: 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Free = 0;..  /* 
d830: 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
d840: 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20  pgno hash table 
d850: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  */.  if( pPg->pN
d860: 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
d870: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
d880: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
d890: 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
d8a0: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
d8b0: 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
d8c0: 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
d8d0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
d8e0: 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
d8f0: 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65      int h = page
d900: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
d910: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d920: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
d930: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
d940: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
d950: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
d960: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
d970: 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
d980: 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
d990: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d9a0: 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
d9b0: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
d9c0: 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65   database.  Dele
d9d0: 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20  te.** all pages 
d9e0: 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61  whose pgno is la
d9f0: 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
da00: 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
da10: 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
da20: 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
da30: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
da40: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
da50: 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74   zeroed..*/.stat
da60: 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72  ic void memoryTr
da70: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
da80: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
da90: 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
daa0: 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
dab0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
dac0: 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
dad0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
dae0: 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
daf0: 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
db00: 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
db10: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
db20: 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
db30: 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
db40: 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
db50: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
db60: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
db70: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
db80: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
db90: 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
dba0: 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
dbb0: 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
dbc0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
dbd0: 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
dbe0: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
dbf0: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
dc00: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
dc10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
dc20: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
dc30: 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75  e file to the nu
dc40: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70  mber of pages sp
dc50: 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ecified..*/.int 
dc60: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
dc70: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
dc80: 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
dc90: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
dca0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
dcb0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
dcc0: 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
dcd0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
dce0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
dcf0: 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
dd00: 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
dd10: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
dd20: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
dd30: 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67  f( nPage>=(unsig
dd40: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
dd50: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
dd60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
dd70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
dd80: 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
dd90: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
dda0: 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
ddb0: 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
ddc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ddd0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
dde0: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
ddf0: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
de00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
de10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
de20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
de30: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
de40: 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  >fd, SQLITE_PAGE
de50: 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6e 50 61  _SIZE*(off_t)nPa
de60: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
de70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
de80: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
de90: 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65   nPage;.  }.  re
dea0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
deb0: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
dec0: 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
ded0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
dee0: 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
def0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
df00: 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
df10: 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
df20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
df30: 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
df40: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
df50: 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
df60: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
df70: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
df80: 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
df90: 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
dfa0: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
dfb0: 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
dfc0: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
dfd0: 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
dfe0: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
dff0: 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
e000: 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
e010: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
e020: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
e030: 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  _close(Pager *pP
e040: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
e050: 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73  pPg, *pNext;.  s
e060: 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73  witch( pPager->s
e070: 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65  tate ){.    case
e080: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a   PAGER_RESERVED:
e090: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
e0a0: 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73  SYNCED: .    cas
e0b0: 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  e PAGER_EXCLUSIV
e0c0: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
e0d0: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
e0e0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
e0f0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
e100: 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Db ){.        sq
e110: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
e120: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
e130: 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
e140: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e150: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
e160: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
e170: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e180: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20 7b   PAGER_SHARED: {
e190: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
e1a0: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
e1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
e1c0: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
e1d0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
e1e0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e1f0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
e200: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
e210: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
e220: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e230: 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50    }.  for(pPg=pP
e240: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
e250: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66   pPg=pNext){.#if
e260: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
e270: 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
e280: 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  b ){.      PgHis
e290: 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
e2a0: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
e2b0: 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
e2c0: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
e2d0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
e2e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
e2f0: 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
e300: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
e310: 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
e320: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
e330: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
e340: 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
e350: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
e360: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
e370: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
e380: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
e390: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
e3a0: 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
e3b0: 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
e3c0: 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
e3d0: 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
e3e0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
e3f0: 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
e400: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
e410: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
e420: 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43 4c 52 5f  ** }.  */.  CLR_
e430: 50 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20  PAGER(pPager);. 
e440: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69   if( pPager->zFi
e450: 6c 65 6e 61 6d 65 21 3d 28 63 68 61 72 2a 29 26  lename!=(char*)&
e460: 70 50 61 67 65 72 5b 31 5d 20 29 7b 0a 20 20 20  pPager[1] ){.   
e470: 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f   assert( 0 );  /
e480: 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20  * Cannot happen 
e490: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
e4a0: 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
e4b0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
e4c0: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Free(pPager->zJo
e4d0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
e4e0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
e4f0: 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a  Directory);.  }.
e500: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
e510: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
e520: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e530: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
e540: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
e550: 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
e560: 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
e570: 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62  e3pager_pagenumb
e580: 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  er(void *pData){
e590: 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44 41  .  PgHdr *p = DA
e5a0: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
e5b0: 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  a);.  return p->
e5c0: 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pgno;.}../*.** T
e5d0: 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75  he page_ref() fu
e5e0: 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74  nction increment
e5f0: 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
e600: 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
e610: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  ..** If the page
e620: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
e630: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74   the freelist (t
e640: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
e650: 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e  nt is zero) then
e660: 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72  .** remove it fr
e670: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  om the freelist.
e680: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74  .**.** For non-t
e690: 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
e6a0: 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63  e_ref() is a mac
e6b0: 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70  ro that calls _p
e6c0: 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c  age_ref().** onl
e6d0: 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72  ine of the refer
e6e0: 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
e6f0: 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79  ro.  For test sy
e700: 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
e710: 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66  ).** is a real f
e720: 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  unction so that 
e730: 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b  we can set break
e740: 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65  points and trace
e750: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
e760: 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67  oid _page_ref(Pg
e770: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
e780: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
e790: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
e7a0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
e7b0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
e7c0: 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  Remove it. */.  
e7d0: 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e    if( pPg==pPg->
e7e0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
e7f0: 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  nced ){.      Pg
e800: 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
e810: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 77  extFree;.      w
e820: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
e830: 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
e840: 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
e850: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
e860: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
e870: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
e880: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
e890: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
e8a0: 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
e8b0: 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
e8c0: 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
e8d0: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
e8e0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
e8f0: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
e900: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
e910: 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
e920: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
e930: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
e940: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
e950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
e960: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73  Pg->pPager->pLas
e970: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
e980: 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ee;.    }.    pP
e990: 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b  g->pPager->nRef+
e9a0: 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52  +;.  }.  pPg->nR
e9b0: 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef++;.  REFINFO(
e9c0: 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  pPg);.}.#ifdef S
e9d0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61  QLITE_TEST.  sta
e9e0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
e9f0: 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
ea00: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
ea10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
ea20: 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
ea30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
ea40: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  g->nRef++;.     
ea50: 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20   REFINFO(pPg);. 
ea60: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23     }.  }.#else.#
ea70: 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66   define page_ref
ea80: 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66  (P)   ((P)->nRef
ea90: 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29  ==0?_page_ref(P)
eaa0: 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66  :(void)(P)->nRef
eab0: 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ++).#endif../*.*
eac0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
ead0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
eae0: 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65  for a page.  The
eaf0: 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69   input pointer i
eb00: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
eb10: 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   to the page dat
eb20: 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  a..*/.int sqlite
eb30: 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20  3pager_ref(void 
eb40: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
eb50: 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
eb60: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
eb70: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
eb80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
eb90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
eba0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
ebb0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
ebc0: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
ebd0: 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
ebe0: 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
ebf0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
ec00: 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
ec10: 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
ec20: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
ec30: 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  .  It is not saf
ec40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
ec50: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
ec60: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74  e file until aft
ec70: 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  er.** the journa
ec80: 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  l has been synce
ec90: 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69  d.  If the origi
eca0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  nal database is 
ecb0: 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a  modified before.
ecc0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
ecd0: 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70  s synced and a p
ece0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
ecf0: 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65  urs, the unsynce
ed00: 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74  d journal.** dat
ed10: 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20  a would be lost 
ed20: 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20  and we would be 
ed30: 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65  unable to comple
ed40: 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68  tely rollback th
ed50: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
ed60: 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65  anges.  Database
ed70: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c   corruption woul
ed80: 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20  d occur..** .** 
ed90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
eda0: 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52  o updates the nR
edb0: 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
edc0: 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
edd0: 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63  urnal..** (See c
ede0: 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  omments on the p
edf0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
ee00: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
ee10: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
ee20: 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73  on.).** If the s
ee30: 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c  ync mode is FULL
ee40: 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c  , two syncs will
ee50: 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74   occur.  First t
ee60: 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
ee70: 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74  .** is synced, t
ee80: 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
ee90: 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74  ld is updated, t
eea0: 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e  hen a second syn
eeb0: 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
eec0: 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  For temporary da
eed0: 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e  tabases, we do n
eee0: 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72  ot care if we ar
eef0: 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
ef00: 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f  ck.** after a po
ef10: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20  wer failure, so 
ef20: 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
ef30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ef40: 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53  clears the needS
ef50: 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65  ync field of eve
ef60: 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20  ry page current 
ef70: 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72  held in.** memor
ef80: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
ef90: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
efa0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
efb0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
efc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
efd0: 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20  ..  /* Sync the 
efe0: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d  journal before m
eff0: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69  odifying the mai
f000: 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  n database.  ** 
f010: 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20  (assuming there 
f020: 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  is a journal and
f030: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
f040: 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20  synced.).  */.  
f050: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
f060: 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20  Sync ){.    if( 
f070: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
f080: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
f090: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
f0a0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
f0b0: 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67  /* assert( !pPag
f0c0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f  er->noSync ); //
f0d0: 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65   noSync might be
f0e0: 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e   set if synchron
f0f0: 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73  ous.      ** was
f100: 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65   turned off afte
f110: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
f120: 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20  n was started.  
f130: 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23  Ticket #615 */.#
f140: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
f150: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
f160: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
f170: 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e  Pager->nRec coun
f180: 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69  ter we are keepi
f190: 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20  ng agrees.      
f1a0: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52    ** with the nR
f1b0: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
f1c0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
f1d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
f1e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f1f0: 20 20 6f 66 66 5f 74 20 6a 53 7a 3b 0a 20 20 20    off_t jSz;.   
f200: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f210: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
f220: 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b  ger->jfd, &jSz);
f230: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
f240: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
f250: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f260: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f270: 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  ff==jSz );.     
f280: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
f290: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
f2a0: 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
f2b0: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
f2c0: 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
f2d0: 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
f2e0: 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
f2f0: 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
f300: 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
f310: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
f320: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
f330: 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
f340: 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
f350: 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
f360: 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
f370: 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
f380: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
f390: 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20  llback. .       
f3a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
f3b0: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
f3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52   ){.          TR
f3d0: 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
f3e0: 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  al of %d\n", pPa
f3f0: 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
f400: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f410: 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72  e3OsSync(&pPager
f420: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
f430: 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
f440: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
f450: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
f460: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
f470: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
f480: 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
f490: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f4a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
f4b0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
f4c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
f4d0: 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
f4e0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
f4f0: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 73  n rc;..        s
f500: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
f510: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
f520: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
f540: 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
f550: 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  al of %d\n", pPa
f560: 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
f570: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f580: 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66  Sync(&pPager->jf
f590: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
f5a0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
f5b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
f5c0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
f5d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
f5e0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
f5f0: 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65  0;..    /* Erase
f600: 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c   the needSync fl
f610: 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61  ag from every pa
f620: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ge..    */.    f
f630: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
f640: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
f650: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
f660: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
f670: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
f680: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
f690: 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
f6a0: 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66  pFirst;.  }..#if
f6b0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
f6c0: 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
f6d0: 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63  edSync flag is c
f6e0: 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67  lear then the Pg
f6f0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a  Hdr.needSync.  *
f700: 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f  * flag must also
f710: 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c   be clear for al
f720: 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79  l pages.  Verify
f730: 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
f740: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75  invariant is tru
f750: 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
f760: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
f770: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
f780: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
f790: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
f7a0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
f7b0: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  0 );.    }.    a
f7c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
f7d0: 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61  FirstSynced==pPa
f7e0: 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20  ger->pFirst );. 
f7f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
f800: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f810: 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
f820: 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
f830: 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
f840: 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
f850: 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
f860: 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
f870: 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
f880: 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61  base file and ma
f890: 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61  rk them all.** a
f8a0: 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74  s clean..*/.stat
f8b0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
f8c0: 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
f8d0: 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
f8e0: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e  er *pPager;.  in
f8f0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 75 73 79  t rc;.  int busy
f900: 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 70 4c 69   = 1;..  if( pLi
f910: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  st==0 ) return S
f920: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
f930: 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
f940: 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  er;..  /* At thi
f950: 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
f960: 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
f970: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
f980: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
f990: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
f9a0: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
f9b0: 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
f9c0: 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
f9d0: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
f9e0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  lls to sqlite3Os
f9f0: 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70  Lock() are no-op
fa00: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76  s..  **.  ** Mov
fa10: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f  ing the lock fro
fa20: 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58  m RESERVED to EX
fa30: 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79  CLUSIVE actually
fa40: 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a   involves going.
fa50: 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20    ** through an 
fa60: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
fa70: 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20  te PENDING.   A 
fa80: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65  PENDING lock pre
fa90: 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72  vents new.  ** r
faa0: 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61  eaders from atta
fab0: 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  ching to the dat
fac0: 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73  abase but is uns
fad0: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73  ufficient for us
fae0: 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20   to.  ** write. 
faf0: 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50   The idea of a P
fb00: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74  ENDING lock is t
fb10: 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65  o prevent new re
fb20: 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  aders from.  ** 
fb30: 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20  coming in while 
fb40: 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73  we wait for exis
fb50: 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20  ting readers to 
fb60: 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  clear..  **.  **
fb70: 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   While the pager
fb80: 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52   is in the RESER
fb90: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f  VED state, the o
fba0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
fbb0: 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e   file.  ** is un
fbc0: 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63  changed and we c
fbd0: 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68  an rollback with
fbe0: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c  out having to pl
fbf0: 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20  ayback the.  ** 
fc00: 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
fc10: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
fc20: 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77  se file.  Once w
fc30: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a  e transition to.
fc40: 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20    ** EXCLUSIVE, 
fc50: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  it means the dat
fc60: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62  abase file has b
fc70: 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20  een changed and 
fc80: 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  any rollback.  *
fc90: 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  * will require a
fca0: 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
fcb0: 6b 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20  k..  */.  do {. 
fcc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fcd0: 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  sLock(&pPager->f
fce0: 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
fcf0: 4b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  K);.  }while( rc
fd00: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
fd10: 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
fd20: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20  pBusyHandler && 
fd30: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
fd40: 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75  BusyHandler->xFu
fd50: 6e 63 20 26 26 20 0a 20 20 20 20 20 20 70 50 61  nc && .      pPa
fd60: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
fd70: 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d  r->xFunc(pPager-
fd80: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70  >pBusyHandler->p
fd90: 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20 29  Arg, busy++).  )
fda0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
fdb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
fdc0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
fdd0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
fde0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a  GER_EXCLUSIVE;..
fdf0: 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
fe00: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
fe10: 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  ist->dirty );.  
fe20: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
fe30: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c  &pPager->fd, (pL
fe40: 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f 66  ist->pgno-1)*(of
fe50: 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f  f_t)SQLITE_PAGE_
fe60: 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45 43  SIZE);.    CODEC
fe70: 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
fe80: 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
fe90: 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
fea0: 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4f 52      TRACE2("STOR
feb0: 45 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 4c  E page %d\n", pL
fec0: 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
fed0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
fee0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
fef0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
ff00: 4c 69 73 74 29 2c 20 53 51 4c 49 54 45 5f 50 41  List), SQLITE_PA
ff10: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f  GE_SIZE);.    CO
ff20: 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
ff30: 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
ff40: 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 30  , pList->pgno, 0
ff50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
ff60: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
ff70: 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b  List->dirty = 0;
ff80: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
ff90: 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
ffa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ffb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c  OK;.}../*.** Col
ffc0: 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79  lect every dirty
ffd0: 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72   page into a dir
ffe0: 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72  ty list and.** r
fff0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
10000 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
10010 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70  hat list.  All p
10020 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c  ages are.** coll
10030 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68  ected even if th
10040 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  ey are still in 
10050 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  use..*/.static P
10060 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f  gHdr *pager_get_
10070 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
10080 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
10090 20 20 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69    PgHdr *p, *pLi
100a0 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b  st;.  pList = 0;
100b0 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
100c0 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
100d0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
100e0 28 20 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  ( p->dirty ){.  
100f0 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
10100 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c 69  pList;.      pLi
10110 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  st = p;.    }.  
10120 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
10130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
10140 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  re a page..**.**
10150 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   A read lock on 
10160 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73  the disk file is
10170 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74   obtained when t
10180 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73  he first page is
10190 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54   acquired. .** T
101a0 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  his read lock is
101b0 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68   dropped when th
101c0 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  e last page is r
101d0 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eleased..**.** A
101e0 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20   _get works for 
101f0 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20  any page number 
10200 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20  greater than 0. 
10210 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
10220 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c  .** file is smal
10230 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
10240 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65  uested page, the
10250 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b  n no actual disk
10260 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20  .** read occurs 
10270 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  and the memory i
10280 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  mage of the page
10290 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
102a0 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e  to.** all zeros.
102b0 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61    The extra data
102c0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
102d0 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
102e0 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20  itialized.** to 
102f0 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20  zeros the first 
10300 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
10310 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
10320 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  y..**.** The acq
10330 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
10340 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
10350 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
10360 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
10370 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
10380 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10390 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
103a0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
103b0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
103c0 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
103d0 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
103e0 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75  utine and _looku
103f0 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
10400 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
10410 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
10420 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
10430 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
10440 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
10450 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
10460 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
10470 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
10480 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a  ereas _lookup().
10490 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
104a0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
104b0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
104c0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
104d0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
104e0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
104f0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
10500 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
10510 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
10520 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f  y..** Since _loo
10530 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
10540 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
10550 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
10560 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
10570 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
10580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
10590 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50  er_get(Pager *pP
105a0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
105b0 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b   void **ppPage){
105c0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
105d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4d   int rc;..  /* M
105e0 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
105f0 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
10600 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
10610 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
10620 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
10630 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
10640 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
10650 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
10660 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45  Mask & ~(PAGER_E
10670 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20  RR_FULL) ){.    
10680 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
10690 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
106a0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
106b0 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
106c0 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
106d0 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
106e0 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
106f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
10700 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
10710 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 70 50 61  >nRef==0 && !pPa
10720 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
10730 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a    int busy = 1;.
10740 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
10750 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
10760 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  k(&pPager->fd, S
10770 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
10780 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
10790 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20  ITE_BUSY && .   
107a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
107b0 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a 20 20  syHandler && .  
107c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
107d0 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e  usyHandler->xFun
107e0 63 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  c && .        pP
107f0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
10800 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65 72  er->xFunc(pPager
10810 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
10820 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20  pArg, busy++).  
10830 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
10840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10850 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10860 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
10870 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
10880 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49  HARED;..    /* I
10890 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
108a0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
108b0 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
108c0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
108d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
108e0 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
108f0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
10900 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
10910 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
10920 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
10930 65 4a 6f 75 72 6e 61 6c 20 26 26 20 0a 20 20 20  eJournal && .   
10940 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69       sqlite3OsFi
10950 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  leExists(pPager-
10960 3e 7a 4a 6f 75 72 6e 61 6c 29 20 26 26 0a 20 20  >zJournal) &&.  
10970 20 20 20 20 20 20 21 73 71 6c 69 74 65 33 4f 73        !sqlite3Os
10980 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
10990 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  k(&pPager->fd) .
109a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 69 6e      ){.       in
109b0 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a  t rc;..       /*
109c0 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
109d0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
109e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
109f0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
10a00 0a 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  .       ** impor
10a10 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
10a20 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
10a30 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
10a40 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
10a50 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
10a60 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
10a70 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
10a80 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
10a90 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  .       ** datab
10aa0 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
10ab0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
10ac0 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
10ad0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
10ae0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
10af0 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
10b00 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
10b10 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
10b20 20 69 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62   it .       ** b
10b30 61 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a  ack..       ** .
10b40 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73         ** Becaus
10b50 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
10b60 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
10b70 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
10b80 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  d, the.       **
10b90 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
10ba0 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
10bb0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
10bc0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
10bd0 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
10be0 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49  it's own EXCLUSI
10bf0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
10c00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
10c10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
10c20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
10c30 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  k(&pPager->fd, E
10c40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
10c50 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
10c60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10c70 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
10c80 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
10c90 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
10ca0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
10cb0 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
10cc0 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  K;.         retu
10cd0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a  rn rc;.       }.
10ce0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
10cf0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
10d00 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20  LUSIVE;..       
10d10 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
10d20 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
10d30 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
10d40 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
10d50 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e      ** we are un
10d60 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  able to open the
10d70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
10d80 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
10d90 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
10da0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
10db0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
10dc0 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
10dd0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
10de0 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
10df0 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
10e00 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
10e10 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20  holds.       ** 
10e20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f  a write lock, so
10e30 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
10e40 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77  any chance of tw
10e50 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20  o or more.      
10e60 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70   ** processes op
10e70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
10e80 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  l at the same ti
10e90 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  me..       */.  
10ea0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10eb0 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
10ec0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
10ed0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
10ee0 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
10ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
10f10 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
10f20 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
10f30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
10f40 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
10f50 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  CK;.         ret
10f60 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
10f70 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
10f80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10f90 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
10fa0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10fb0 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
10fc0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
10fd0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
10fe0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
10ff0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
11000 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11010 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  Hdr = 0;..      
11020 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
11030 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
11040 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
11050 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
11060 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
11070 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
11080 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
11090 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
110a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
110b0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69  Pager);.       i
110c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
110d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74   ){.         ret
110e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d  urn rc;.       }
110f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
11100 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11110 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70   /* Search for p
11120 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  age in cache */.
11130 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
11140 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
11150 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 50  gno);.    if( pP
11160 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
11170 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
11180 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
11190 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
111a0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
111b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
111c0 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
111d0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
111e0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
111f0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
11200 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  */.    int h;.  
11210 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b    pPager->nMiss+
11220 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
11230 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
11240 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65  >mxPage || pPage
11250 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20  r->pFirst==0 || 
11260 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
11270 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
11280 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20   a new page */. 
11290 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
112a0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
112b0 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49 54  of(*pPg) + SQLIT
112c0 45 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  E_PAGE_SIZE .   
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
112f0 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
11300 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->nExtra.      
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 20 20 20 20 20 20 20 2b 20 70 50 61 67 65 72          + pPager
11330 2d 3e 6d 65 6d 44 62 2a 73 69 7a 65 6f 66 28 50  ->memDb*sizeof(P
11340 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
11350 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
11360 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
11370 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
11380 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75           pager_u
11390 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
113a0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
113b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
113c0 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
113d0 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  RR_MEM;.        
113e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
113f0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
11400 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30     memset(pPg, 0
11410 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b  , sizeof(*pPg));
11420 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
11430 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
11440 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
11450 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
11460 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66  ager), 0, sizeof
11470 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20  (PgHistory));.  
11480 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
11490 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
114a0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
114b0 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
114c0 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67  pAll;.      pPag
114d0 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
114e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
114f0 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  age++;.    }else
11500 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20  {.      /* Find 
11510 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
11520 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
11530 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
11540 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  es not.      ** 
11550 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
11560 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
11570 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  he journal..    
11580 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d    */.      pPg =
11590 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
115a0 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  ynced;..      /*
115b0 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
115c0 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
115d0 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
115e0 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
115f0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f      ** on the jo
11600 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
11610 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
11620 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
11630 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65 72 79   a.      ** very
11640 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
11650 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
11660 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
11670 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20  ut sometimes.   
11680 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62     ** it can't b
11690 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20 20 20  e helped..      
116a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
116b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
116c0 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
116d0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
116e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
116f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11700 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
11710 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
11720 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11730 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
11740 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
11750 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
11760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
11770 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
11780 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
11790 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
117a0 72 20 69 6e 74 6f 20 74 68 65 0a 09 20 20 2a 2a  r into the..  **
117b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
117c0 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61  his is done to a
117d0 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79  void ever modify
117e0 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 09 20  ing a journal.. 
117f0 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
11800 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
11810 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
11820 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 09  ages that have..
11830 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65    ** already bee
11840 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
11850 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61   database (in ca
11860 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73  se the header is
11870 0a 09 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77  ..  ** trashed w
11880 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
11890 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
118a0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
118b0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
118c0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
118d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
118e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
118f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0 );.          r
11900 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
11910 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
11920 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
11930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11940 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
11950 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
11960 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
11970 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
11980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
119a0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
119b0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
119c0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
119d0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  Ref==0 );..     
119e0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
119f0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
11a00 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
11a10 20 64 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f   dirty..      */
11a20 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
11a30 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
11a40 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
11a50 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
11a60 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
11a70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
11a80 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
11a90 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
11aa0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
11ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11ac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
11ad0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
11ae0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
11af0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11b00 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ERR;.        }. 
11b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
11b20 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d  ert( pPg->dirty=
11b30 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
11b40 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
11b50 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
11b60 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
11b70 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
11b80 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
11b90 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
11ba0 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
11bb0 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
11bc0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64       ** sqlite_d
11bd0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f  ont_rollback() o
11be0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
11bf0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
11c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
11c10 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63      ** It is nec
11c20 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69  essary to do thi
11c30 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  s because the pa
11c40 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  ge marked always
11c50 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a  Rollback.      *
11c60 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61  * might be reloa
11c70 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74  ded at a later t
11c80 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20  ime but at that 
11c90 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72  point we won't r
11ca0 65 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a  emember.      **
11cb0 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
11cc0 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
11cd0 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
11ce0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
11cf0 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
11d00 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
11d10 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
11d20 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20  re on out..     
11d30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
11d40 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
11d50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  k ){.        pPa
11d60 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
11d70 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ack = 1;.      }
11d80 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e  ..      /* Unlin
11d90 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66  k the old page f
11da0 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
11db0 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74  t and the hash t
11dc0 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  able.      */.  
11dd0 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70      unlinkPage(p
11de0 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
11df0 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  r->nOvfl++;.    
11e00 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  }.    pPg->pgno 
11e10 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  = pgno;.    if( 
11e20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
11e30 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
11e40 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
11e50 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
11e60 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28  ite3CheckMemory(
11e70 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
11e80 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20  al, pgno/8);.   
11e90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11ea0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
11eb0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
11ec0 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
11ed0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
11ee0 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
11ef0 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  &7)))!=0;.      
11f00 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
11f10 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
11f20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
11f30 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
11f40 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
11f50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11f60 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26  Pager->aInStmt &
11f70 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
11f80 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20  ger->stmtSize.  
11f90 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
11fa0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
11fb0 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
11fc0 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20  no&7)))!=0 ){.  
11fd0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
11fe0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
11ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12000 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
12010 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  m_stmt_list(pPg)
12020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
12030 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
12040 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pPg->nRef = 1;. 
12050 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
12060 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
12070 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67  f++;.    h = pag
12080 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20  er_hash(pgno);. 
12090 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
120a0 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
120b0 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
120c0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
120d0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
120e0 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
120f0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
12100 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
12110 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
12120 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
12130 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
12140 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12150 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
12160 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
12170 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
12180 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
12190 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
121a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
121b0 62 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74 65  bSize<0 ) sqlite
121c0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
121d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
121e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
121f0 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  k!=0 ){.      sq
12200 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
12210 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
12220 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pg));.      rc =
12230 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
12240 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65  Pager);.      re
12250 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
12260 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
12270 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20  bSize<(int)pgno 
12280 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
12290 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
122a0 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41  g), 0, SQLITE_PA
122b0 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65  GE_SIZE);.    }e
122c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
122d0 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
122e0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
122f0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
12300 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
12310 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
12320 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47  off_t)SQLITE_PAG
12330 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72  E_SIZE);.      r
12340 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
12350 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  d(&pPager->fd, P
12360 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
12370 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ), SQLITE_PAGE_S
12380 49 5a 45 29 3b 0a 20 20 20 20 20 20 54 52 41 43  IZE);.      TRAC
12390 45 32 28 22 46 45 54 43 48 20 70 61 67 65 20 25  E2("FETCH page %
123a0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  d\n", pPg->pgno)
123b0 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
123c0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
123d0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
123e0 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  gno, 3);.      i
123f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12400 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   ){.        off_
12410 74 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20  t fileSize;.    
12420 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f      if( sqlite3O
12430 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
12440 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29  r->fd,&fileSize)
12450 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  !=SQLITE_OK.    
12460 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69             || fi
12470 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 53 51 4c  leSize>=pgno*SQL
12480 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ITE_PAGE_SIZE ){
12490 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
124a0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
124b0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
124c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
124d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
124e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
124f0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
12500 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53  _DATA(pPg), 0, S
12510 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
12520 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12530 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
12540 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
12550 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
12560 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
12570 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  e. */.    pPager
12580 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61  ->nHit++;.    pa
12590 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
125a0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48  .  *ppPage = PGH
125b0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
125c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
125d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
125e0 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
125f0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
12600 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
12610 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
12620 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
12630 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
12640 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
12650 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
12660 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
12670 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
12680 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
12690 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e  ite3pager_get().
126a0 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
126b0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
126c0 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
126d0 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
126e0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
126f0 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
12700 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
12710 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
12720 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
12730 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
12740 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
12750 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
12760 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
12770 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
12780 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
12790 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
127a0 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ppened..*/.void 
127b0 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f  *sqlite3pager_lo
127c0 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
127d0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
127e0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
127f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
12800 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12810 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28  pgno!=0 );.  if(
12820 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
12830 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46   & ~(PAGER_ERR_F
12840 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ULL) ){.    retu
12850 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20  rn 0;.  }.  pPg 
12860 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
12870 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
12880 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74  if( pPg==0 ) ret
12890 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65  urn 0;.  page_re
128a0 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
128b0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
128c0 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pg);.}../*.** Re
128d0 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
128e0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
128f0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
12900 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
12910 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
12920 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
12930 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
12940 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
12950 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
12960 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
12970 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
12980 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
12990 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
129a0 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
129b0 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
129c0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
129d0 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
129e0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
129f0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
12a00 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
12a10 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
12a20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f  */.  pPg = DATA_
12a30 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
12a40 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
12a50 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d  nRef>0 );.  pPg-
12a60 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
12a70 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  FO(pPg);..  /* W
12a80 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
12a90 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
12aa0 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
12ab0 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
12ac0 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
12ad0 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
12ae0 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
12af0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
12b00 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
12b10 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61  *pPager;.    pPa
12b20 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
12b30 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
12b40 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70  tFree = 0;.    p
12b50 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
12b60 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20  pPager->pLast;. 
12b70 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
12b80 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
12b90 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
12ba0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
12bb0 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
12bc0 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c  e = pPg;.    }el
12bd0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
12be0 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a  ->pFirst = pPg;.
12bf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
12c00 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26  g->needSync==0 &
12c10 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  & pPager->pFirst
12c20 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Synced==0 ){.   
12c30 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
12c40 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20  tSynced = pPg;. 
12c50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
12c60 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
12c70 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12c80 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
12c90 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
12ca0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
12cb0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c  .    /* When all
12cc0 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65   pages reach the
12cd0 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20   freelist, drop 
12ce0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72  the read lock fr
12cf0 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  om.    ** the da
12d00 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
12d10 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
12d20 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65  nRef--;.    asse
12d30 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
12d40 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
12d50 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
12d60 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & !pPager->memDb
12d70 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
12d80 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12d90 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12da0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12db0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
12dc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
12dd0 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
12de0 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
12df0 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
12e00 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
12e10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
12e20 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
12e30 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12e40 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
12e50 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
12e60 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
12e70 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
12e80 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
12e90 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
12ea0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
12eb0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
12ec0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
12ed0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
12ee0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
12ef0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
12f00 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 61 73  r->memDb );.  as
12f10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
12f20 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
12f30 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
12f40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12f50 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Open==0 );.  ass
12f60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
12f70 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c  Journal );.  sql
12f80 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
12f90 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  unt(pPager);.  p
12fa0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
12fb0 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
12fc0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
12fd0 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
12fe0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
12ff0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  al==0 ){.    sql
13000 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
13010 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
13020 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
13030 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
13040 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
13050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13060 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
13070 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
13080 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  sive(pPager->zJo
13090 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
130a0 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70  jfd,pPager->temp
130b0 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  File);.  pPager-
130c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
130d0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
130e0 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
130f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
13100 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
13110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
13120 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
13130 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
13140 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
13150 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73  urnal = 0;.    s
13160 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
13170 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
13180 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
13190 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
131a0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
131b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
131c0 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71  NTOPEN;.  }.  sq
131d0 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
131e0 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  tory(pPager->zDi
131f0 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72  rectory, &pPager
13200 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72  ->jfd);.  pPager
13210 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
13220 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
13230 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
13240 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
13250 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
13260 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
13270 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
13280 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
13290 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
132a0 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
132b0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
132c0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
132d0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
132e0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
132f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
13300 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
13310 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
13320 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
13330 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
13340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13350 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
13360 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
13370 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
13380 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13390 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
133a0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
133b0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
133c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
133d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
133e0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
133f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
13400 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  c;  .}../*.** Ac
13410 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
13420 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
13430 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
13440 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
13450 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
13460 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
13470 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
13480 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
13490 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
134a0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
134b0 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73  er_rollback() is
134c0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
134d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
134e0 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
134f0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
13500 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73  pager_unref() is
13510 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76   called to on ev
13520 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ery outstanding 
13530 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
13540 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
13550 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
13560 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
13570 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66  any open page of
13580 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
13590 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20   file.  Nothing 
135a0 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68  changes about th
135b0 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75  e page - it is u
135c0 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a  sed merely to.**
135d0 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74   acquire a point
135e0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
135f0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73  structure and as
13600 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72   proof that ther
13610 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20  e is.** already 
13620 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
13630 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
13640 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61  ** The second pa
13650 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
13660 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  s how much space
13670 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73   in bytes to res
13680 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61  erve for a.** ma
13690 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
136a0 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74  e-name at the st
136b0 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
136c0 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72  al when it is cr
136d0 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  eated..**.** A j
136e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
136f0 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73  pened if this is
13700 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
13710 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70   file.  For temp
13720 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20  orary.** files, 
13730 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74  the opening of t
13740 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13750 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
13760 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a  l there is an.**
13770 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
13780 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
13790 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rnal..**.** If t
137a0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
137b0 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20  lready reserved 
137c0 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69  for writing, thi
137d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
137e0 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
137f0 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28  ite3pager_begin(
13800 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
13810 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
13820 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
13830 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
13840 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
13850 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13860 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
13870 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
13880 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13890 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
138a0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
138b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
138c0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
138d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
138e0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
138f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
13900 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
13910 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
13920 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
13930 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
13940 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
13950 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
13960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13970 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20  int busy = 1;.  
13980 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
13990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
139a0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
139b0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
139c0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72  .      }while( r
139d0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
139e0 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  & .          pPa
139f0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
13a00 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  r && .          
13a10 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
13a20 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a  dler->xFunc && .
13a30 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
13a40 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
13a50 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42  xFunc(pPager->pB
13a60 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67  usyHandler->pArg
13a70 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20 20  , busy++).      
13a80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13aa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13ac0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
13ad0 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
13ae0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
13af0 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
13b00 20 20 20 54 52 41 43 45 32 28 22 54 52 41 4e 53     TRACE2("TRANS
13b10 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 70 50  ACTION %d\n", pP
13b20 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20  ager->fd.h);.   
13b30 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
13b40 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
13b50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
13b60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
13b70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
13b80 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
13b90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
13ba0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13bb0 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
13bc0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
13bd0 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
13be0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
13bf0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
13c00 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
13c10 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
13c20 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
13c30 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
13c40 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
13c50 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
13c60 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
13c70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13c80 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
13c90 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
13ca0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
13cb0 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
13cc0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13cd0 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
13ce0 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
13cf0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
13d00 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
13d10 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
13d20 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
13d30 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
13d40 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
13d50 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
13d60 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
13d70 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
13d80 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
13d90 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
13da0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
13db0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
13dc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13dd0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
13de0 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
13df0 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
13e00 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
13e10 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
13e20 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
13e30 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
13e40 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
13e50 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
13e60 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
13e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
13e80 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
13e90 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
13ea0 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
13eb0 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67  () or sqlite3pag
13ec0 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f  er_rollback() to
13ed0 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e  .** reset..*/.in
13ee0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  t sqlite3pager_w
13ef0 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61  rite(void *pData
13f00 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
13f10 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
13f20 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
13f30 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
13f40 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
13f50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
13f60 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
13f70 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
13f80 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29  Pager->errMask )
13f90 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  { .    return pa
13fa0 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
13fb0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
13fc0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
13fd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13fe0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
13ff0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
14000 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
14010 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
14020 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
14030 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
14040 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
14050 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
14060 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
14070 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
14080 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50   away..  */.  pP
14090 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
140a0 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
140b0 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74  al && (pPg->inSt
140c0 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  mt || pPager->st
140d0 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  mtInUse==0) ){. 
140e0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
140f0 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 72  Cache = 1;.    r
14100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14110 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
14120 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
14130 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
14140 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
14150 65 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74  e.  ** written t
14160 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
14170 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
14180 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
14190 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68  nal.  ** or both
141a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73  ..  **.  ** Firs
141b0 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
141c0 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
141d0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
141e0 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61  ts and.  ** crea
141f0 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
14200 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
14210 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
14220 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
14230 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
14240 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  e3pager_begin(pD
14250 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ata);.  if( rc!=
14260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14270 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14280 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14290 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
142a0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28  ESERVED );.  if(
142b0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
142c0 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
142d0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >useJournal ){. 
142e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
142f0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
14300 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
14310 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
14320 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
14330 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
14340 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
14350 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
14360 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  );.  pPager->dir
14370 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20  tyCache = 1;..  
14380 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
14390 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
143a0 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
143b0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
143c0 61 6e 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  an.  ** EXCLUSIV
143d0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
143e0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
143f0 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
14400 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 2a  rent page to.  *
14410 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
14420 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
14430 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
14440 65 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eady..  */.  if(
14450 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
14460 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65   && (pPager->use
14470 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
14480 72 2d 3e 6d 65 6d 44 62 29 20 29 7b 0a 20 20 20  r->memDb) ){.   
14490 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
144a0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
144b0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
144c0 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20     int szPg;.   
144d0 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20     u32 saved;.  
144e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
144f0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20  memDb ){.       
14500 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
14510 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
14520 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
14530 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22          TRACE2("
14540 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25 64 5c  JOURNAL page %d\
14550 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  n", pPg->pgno);.
14560 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14570 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
14580 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
14590 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65  ->pOrig = sqlite
145a0 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
145b0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
145c0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
145d0 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
145e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
145f0 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f  t->pOrig, PGHDR_
14600 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
14610 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
14620 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14630 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
14640 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  l = 1;.      }el
14650 73 65 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20  se{.        u32 
14660 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
14670 73 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d  sum(pPager, pPg-
14680 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20  >pgno, pData);. 
14690 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
146a0 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
146b0 58 54 52 41 28 70 50 67 29 3b 0a 20 20 20 20 20  XTRA(pPg);.     
146c0 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63     store32bits(c
146d0 6b 73 75 6d 2c 20 70 50 67 2c 20 53 51 4c 49 54  ksum, pPg, SQLIT
146e0 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
146f0 20 20 20 20 20 20 73 7a 50 67 20 3d 20 53 51 4c        szPg = SQL
14700 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b 38 3b  ITE_PAGE_SIZE+8;
14710 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32  .        store32
14720 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20  bits(pPg->pgno, 
14730 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20  pPg, -4);.      
14740 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
14750 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
14760 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , 7);.        rc
14770 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
14780 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
14790 26 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b  &((char*)pData)[
147a0 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20  -4], szPg);.    
147b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
147c0 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a  nalOff += szPg;.
147d0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
147e0 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25 64 20  JOURNAL page %d 
147f0 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 20  needSync=%d\n", 
14800 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
14810 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
14820 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
14830 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
14840 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 2a  o, 0);.        *
14850 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
14860 58 54 52 41 28 70 50 67 29 20 3d 20 73 61 76 65  XTRA(pPg) = save
14870 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  d;.        if( r
14880 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14890 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
148a0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
148b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
148c0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
148d0 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
148e0 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  FULL;.          
148f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14900 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
14910 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
14920 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14930 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
14940 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
14950 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
14960 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
14970 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
14980 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  );.        pPg->
14990 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
149a0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
149b0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
149c0 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  al = 1;.        
149d0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
149e0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20  InUse ){.       
149f0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
14a00 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
14a10 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
14a20 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  &7);.          p
14a30 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
14a40 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20  list(pPg);.     
14a50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
14a70 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
14a80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
14a90 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
14aa0 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
14ab0 54 52 41 43 45 33 28 22 41 50 50 45 4e 44 20 70  TRACE3("APPEND p
14ac0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
14ad0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
14ae0 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
14af0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14b00 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
14b10 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
14b20 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
14b30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
14b40 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
14b50 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
14b60 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
14b70 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68  t in it,.  ** th
14b80 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
14b90 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
14ba0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
14bb0 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
14bc0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
14bd0 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
14be0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
14bf0 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
14c00 61 6c 20 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 69  al format.  ** i
14c10 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
14c20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
14c30 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
14c40 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
14c50 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70  >stmtInUse && !p
14c60 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69  Pg->inStmt && (i
14c70 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
14c80 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
14c90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
14ca0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
14cb0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
14cc0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
14cd0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
14ce0 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
14cf0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
14d00 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
14d10 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
14d20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14d30 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30   pHist->pStmt==0
14d40 20 29 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   );.      pHist-
14d50 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  >pStmt = sqliteM
14d60 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
14d70 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
14d80 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
14d90 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
14da0 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
14db0 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
14dc0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
14dd0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14de0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32    }.      TRACE2
14df0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 70  ("STMT-JOURNAL p
14e00 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  age %d\n", pPg->
14e10 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pgno);.    }else
14e20 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 33 32 62  {.      store32b
14e30 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  its(pPg->pgno, p
14e40 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 43  Pg, -4);.      C
14e50 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
14e60 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
14e70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14e80 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
14e90 61 67 65 72 2d 3e 73 74 66 64 2c 20 28 28 63 68  ager->stfd, ((ch
14ea0 61 72 2a 29 70 44 61 74 61 29 2d 34 2c 20 53 51  ar*)pData)-4, SQ
14eb0 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b 34  LITE_PAGE_SIZE+4
14ec0 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  );.      TRACE2(
14ed0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 70 61  "STMT-JOURNAL pa
14ee0 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  ge %d\n", pPg->p
14ef0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  gno);.      CODE
14f00 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
14f10 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a   pPg->pgno, 0);.
14f20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14f40 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
14f50 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
14f60 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
14f70 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
14f80 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20  ER_ERR_FULL;.   
14f90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
14fb0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
14fc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14fd0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
14fe0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  =0 );.      pPag
14ff0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
15000 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
15010 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
15020 20 20 7d 0a 20 20 20 20 70 61 67 65 5f 61 64 64    }.    page_add
15030 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
15040 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  g);.  }..  /* Up
15050 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
15060 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
15070 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  n..  */.  if( pP
15080 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
15090 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  t)pPg->pgno ){. 
150a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
150b0 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
150c0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
150d0 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d  memDb && pPager-
150e0 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47  >dbSize==PENDING
150f0 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
15100 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
15110 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b  pPager->dbSize++
15120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
15130 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15140 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
15150 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
15160 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
15170 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
15180 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
15190 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
151a0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
151b0 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
151c0 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
151d0 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
151e0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
151f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
15200 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65  ager_iswriteable
15210 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
15220 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
15230 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
15240 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  a);.  return pPg
15250 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->dirty;.}../*.*
15260 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f  * Replace the co
15270 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c  ntent of a singl
15280 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  e page with the 
15290 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
152a0 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75  he third.** argu
152b0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
152c0 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72  ite3pager_overwr
152d0 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
152e0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
152f0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f  id *pData){.  vo
15300 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  id *pPage;.  int
15310 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
15320 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
15330 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61  ager, pgno, &pPa
15340 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
15350 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15360 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
15370 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
15380 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15390 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
153a0 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44 61  emcpy(pPage, pDa
153b0 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ta, SQLITE_PAGE_
153c0 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  SIZE);.    }.   
153d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
153e0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  ref(pPage);.  }.
153f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15400 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
15410 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
15420 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
15430 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
15440 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
15450 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
15460 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22  n on page "pgno"
15470 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
15480 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
15490 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
154a0 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
154b0 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  irty..**.** The 
154c0 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
154d0 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
154e0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
154f0 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
15500 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
15510 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
15520 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
15530 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
15540 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
15550 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
15560 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
15570 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
15580 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
15590 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
155a0 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
155b0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
155c0 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77  rollback() below
155d0 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62  , more than doub
155e0 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20  le the speed.** 
155f0 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20  of large INSERT 
15600 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71  operations and q
15610 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
15620 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45  ed of large DELE
15630 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  TEs..**.** When 
15640 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15650 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20  called, set the 
15660 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
15670 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20  lag to true..** 
15680 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
15690 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
156a0 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
156b0 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
156c0 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
156d0 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
156e0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
156f0 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
15700 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
15710 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
15720 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
15730 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
15740 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
15750 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
15760 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
15770 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
15780 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
15790 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
157a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
157b0 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
157c0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
157d0 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
157e0 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
157f0 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
15800 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15810 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
15820 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f  ,.** the dont_ro
15830 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
15840 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
15850 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
15860 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72  e contains.** cr
15870 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
15880 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
15890 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f   sure it gets ro
158a0 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
158b0 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e  te.** of the don
158c0 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  t_rollback() cal
158d0 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
158e0 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69  e3pager_dont_wri
158f0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
15900 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
15910 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
15920 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
15930 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50   ) return;..  pP
15940 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
15950 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
15960 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
15970 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28  lback = 1;.  if(
15980 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72   pPg && pPg->dir
15990 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ty ){.    if( pP
159a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
159b0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
159c0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
159d0 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
159e0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
159f0 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
15a00 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
15a10 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
15a20 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
15a30 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
15a40 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
15a50 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
15a60 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
15a70 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
15a80 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
15a90 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
15aa0 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
15ab0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
15ac0 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
15ad0 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
15ae0 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
15af0 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
15b00 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
15b10 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
15b20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
15b30 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
15b40 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
15b50 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
15b60 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
15b70 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
15b80 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
15b90 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
15ba0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
15bb0 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
15bc0 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
15bd0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
15be0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15bf0 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49  TRACE3("DONT_WRI
15c00 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
15c10 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  \n", pgno, pPage
15c20 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20 20  r->fd.h);.      
15c30 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
15c40 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15c50 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
15c60 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
15c70 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
15c80 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
15c90 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
15ca0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
15cb0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
15cc0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
15cd0 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
15ce0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
15cf0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
15d00 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
15d10 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
15d20 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
15d30 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  al..*/.void sqli
15d40 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
15d50 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61  llback(void *pDa
15d60 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
15d70 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
15d80 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
15d90 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
15da0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20  >pPager;..  if( 
15db0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
15dc0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
15dd0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
15de0 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72  lOpen==0 ) retur
15df0 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  n;.  if( pPg->al
15e00 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
15e10 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
15e20 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
15e30 2d 3e 6d 65 6d 44 62 20 29 20 72 65 74 75 72 6e  ->memDb ) return
15e40 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  ;.  if( !pPg->in
15e50 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
15e60 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
15e70 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
15e80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15e90 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
15ea0 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l!=0 );.    pPag
15eb0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
15ec0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
15ed0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
15ee0 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
15ef0 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  nal = 1;.    if(
15f00 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
15f10 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  se ){.      pPag
15f20 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
15f30 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
15f40 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
15f50 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
15f60 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
15f70 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 33      }.    TRACE3
15f80 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  ("DONT_ROLLBACK 
15f90 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
15fa0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 61  , pPg->pgno, pPa
15fb0 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 7d 0a  ger->fd.h);.  }.
15fc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
15fd0 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d  mtInUse && !pPg-
15fe0 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  >inStmt && (int)
15ff0 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
16000 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20  r->stmtSize ){. 
16010 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
16020 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
16030 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
16040 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
16050 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
16060 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
16070 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
16080 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
16090 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
160a0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61  >pgno&7);.    pa
160b0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
160c0 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a  ist(pPg);.  }.}.
160d0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  ../*.** Clear a 
160e0 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a  PgHistory block.
160f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
16100 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69  learHistory(PgHi
16110 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20  story *pHist){. 
16120 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
16130 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
16140 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
16150 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e  Stmt);.  pHist->
16160 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69  pOrig = 0;.  pHi
16170 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d  st->pStmt = 0;.}
16180 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
16190 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
161a0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
161b0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
161c0 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
161d0 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
161e0 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
161f0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
16200 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
16210 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
16220 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
16230 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
16240 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
16250 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
16260 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
16270 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  er_commit(Pager 
16280 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
16290 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
162a0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
162b0 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f  >errMask==PAGER_
162c0 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
162d0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
162e0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
162f0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
16300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
16320 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ULL;.    }.    r
16330 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
16340 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
16350 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
16360 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
16370 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
16380 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
16390 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
163a0 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
163b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
163c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
163d0 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54    TRACE2("COMMIT
163e0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
163f0 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61  fd.h);.  if( pPa
16400 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
16410 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
16420 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
16430 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77  s(pPager);.    w
16440 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20  hile( pPg ){.   
16450 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
16460 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
16470 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20  g, pPager));.   
16480 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
16490 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
164a0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
164b0 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
164c0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
164d0 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
164e0 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
164f0 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
16500 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69  pDirty;.    }.#i
16510 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
16520 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
16530 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
16540 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
16550 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
16560 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
16570 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
16580 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
16590 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
165a0 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
165b0 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
165c0 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
165d0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
165e0 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
165f0 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
16600 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
16610 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
16620 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
16630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16640 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
16650 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
16660 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==0 ){.    /* E
16670 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f  xit early (witho
16680 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d  ut doing the tim
16690 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69  e-consuming sqli
166a0 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c  te3OsSync() call
166b0 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  s).    ** if the
166c0 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
166d0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
166e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
166f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16700 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  ger->needSync==0
16710 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
16720 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
16730 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
16740 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
16750 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
16760 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
16770 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16780 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
16790 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50  te3pager_sync(pP
167a0 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  ager, 0);.  if( 
167b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
167c0 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  .    goto commit
167d0 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63  _abort;.  }.  rc
167e0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
167f0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
16800 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
16810 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   -1;.  return rc
16820 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
16830 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
16840 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20  es wrong during 
16850 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
16860 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f  ss..  */.commit_
16870 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71  abort:.  rc = sq
16880 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
16890 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ack(pPager);.  i
168a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
168b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
168c0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20  ITE_FULL;.  }.  
168d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
168e0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
168f0 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
16900 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
16910 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
16920 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
16930 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
16940 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
16950 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
16960 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
16970 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
16980 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
16990 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
169a0 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
169b0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
169c0 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
169d0 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
169e0 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
169f0 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ol (SQLITE_PROTO
16a00 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73  COL) or unless s
16a10 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
16a20 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20  cess is writing 
16a30 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a  trash into the j
16a40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c  ournal file (SQL
16a50 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a  ITE_CORRUPT) or.
16a60 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f  ** unless a prio
16a70 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  r malloc() faile
16a80 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  d (SQLITE_NOMEM)
16a90 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
16aa0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72  rror.** codes ar
16ab0 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61  e returned for a
16ac0 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f  ll these occasio
16ad0 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  ns.  Otherwise,.
16ae0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
16af0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
16b00 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
16b10 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
16b20 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
16b30 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42  .  TRACE2("ROLLB
16b40 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ACK %d\n", pPage
16b50 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20  r->fd.h);.  if( 
16b60 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
16b70 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
16b80 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d     for(p=pPager-
16b90 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
16ba0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
16bb0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
16bc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16bd0 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  !p->alwaysRollba
16be0 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
16bf0 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  !p->dirty ){.   
16c00 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
16c10 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
16c20 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
16c30 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a  ger))->pOrig );.
16c40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16c50 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
16c60 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
16c70 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20  pPager))->pStmt 
16c80 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
16c90 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nue;.      }..  
16ca0 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
16cb0 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
16cc0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
16cd0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
16ce0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
16cf0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
16d00 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70   pHist->pOrig, p
16d10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16d20 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32  ;.        TRACE2
16d30 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20  ("ROLLBACK-PAGE 
16d40 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b  %d\n", p->pgno);
16d50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16d60 20 20 20 20 20 20 54 52 41 43 45 32 28 22 50 41        TRACE2("PA
16d70 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 5c 6e  GE %d is clean\n
16d80 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  ", p->pgno);.   
16d90 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
16da0 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
16db0 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
16dc0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
16dd0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
16de0 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b    p->inStmt = 0;
16df0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53  .      p->pPrevS
16e00 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74  tmt = p->pNextSt
16e10 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
16e20 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
16e30 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
16e40 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
16e50 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  r(PGHDR_TO_DATA(
16e60 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  p), pPager->page
16e70 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
16e80 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20       .    }.    
16e90 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
16ea0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
16eb0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
16ec0 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20  origDbSize;.    
16ed0 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
16ee0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
16ef0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
16f00 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
16f10 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
16f20 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
16f30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
16f40 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
16f50 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
16f60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16f70 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
16f80 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
16f90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
16fa0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
16fb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
16fc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
16fd0 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26  er->errMask!=0 &
16fe0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  & pPager->errMas
16ff0 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  k!=PAGER_ERR_FUL
17000 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
17010 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
17020 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
17030 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
17040 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
17050 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61   }.    return pa
17060 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
17070 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
17080 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
17090 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
170a0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
170b0 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f   rc = pager_relo
170c0 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
170d0 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  ;.    rc2 = page
170e0 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
170f0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
17100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17110 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
17120 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
17130 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
17140 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
17150 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
17160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17170 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
17180 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  PT;.    pPager->
17190 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
171a0 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20  _ERR_CORRUPT;.  
171b0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
171c0 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ze = -1;.  retur
171d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
171e0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
171f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17200 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
17210 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
17220 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
17230 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
17240 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
17250 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
17260 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61  er_isreadonly(Pa
17270 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
17280 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
17290 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
172a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
172b0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
172c0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
172d0 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
172e0 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73  lite3pager_stats
172f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17300 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
17310 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61  9];.  a[0] = pPa
17320 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31  ger->nRef;.  a[1
17330 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ] = pPager->nPag
17340 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67  e;.  a[2] = pPag
17350 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b  er->mxPage;.  a[
17360 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
17370 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50  ize;.  a[4] = pP
17380 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
17390 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
173a0 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20  rMask;.  a[6] = 
173b0 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20  pPager->nHit;.  
173c0 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[7] = pPager->n
173d0 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70  Miss;.  a[8] = p
173e0 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20  Pager->nOvfl;.  
173f0 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a  return a;.}../*.
17400 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
17410 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
17420 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
17430 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
17440 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
17450 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
17460 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
17470 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
17480 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
17490 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
174a0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
174b0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
174c0 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
174d0 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
174e0 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
174f0 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
17500 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
17510 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  _begin(Pager *pP
17520 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
17530 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
17540 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
17550 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ZE];.  assert( !
17560 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
17570 65 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53  e );.  TRACE2("S
17580 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c  TMT-BEGIN %d\n",
17590 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
175a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
175b0 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
175c0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
175d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
175e0 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
175f0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74  >dbSize;.    ret
17600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17610 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
17620 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
17630 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
17640 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20  tAutoopen = 1;. 
17650 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17660 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
17670 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
17680 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67  alOpen );.  pPag
17690 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71  er->aInStmt = sq
176a0 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
176b0 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
176c0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
176d0 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a  ->aInStmt==0 ){.
176e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63      sqlite3OsLoc
176f0 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  k(&pPager->fd, S
17700 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
17710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
17720 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  OMEM;.  }.#ifnde
17730 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20  f NDEBUG.  rc = 
17740 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
17750 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
17760 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69  &pPager->stmtJSi
17770 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
17780 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
17790 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74  failed;.  assert
177a0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  ( pPager->stmtJS
177b0 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a  ize == pPager->j
177c0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e  ournalOff );.#en
177d0 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  dif.  pPager->st
177e0 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
177f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
17800 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
17810 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
17820 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
17830 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
17840 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
17850 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
17860 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
17870 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
17880 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17890 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
178a0 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e  zTemp, &pPager->
178b0 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  stfd);.    if( r
178c0 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
178d0 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
178e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
178f0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
17900 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
17910 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
17920 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
17930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17940 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
17950 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
17960 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
17970 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
17980 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
17990 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
179a0 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
179b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
179c0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
179d0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
179e0 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
179f0 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
17a00 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
17a10 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
17a20 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
17a30 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52  , *pNext;.    TR
17a40 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE2("STMT-COMMI
17a50 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  T %d\n", pPager-
17a60 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20  >fd.h);.    if( 
17a70 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
17a80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
17a90 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73  sSeek(&pPager->s
17aa0 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f  tfd, 0);.      /
17ab0 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  * sqlite3OsTrunc
17ac0 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ate(&pPager->stf
17ad0 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  d, 0); */.      
17ae0 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
17af0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20  er->aInStmt );. 
17b00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
17b10 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
17b20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
17b30 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
17b40 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
17b50 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
17b60 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20  NextStmt;.      
17b70 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53  assert( pPg->inS
17b80 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67  tmt );.      pPg
17b90 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
17ba0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
17bb0 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
17bc0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
17bd0 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
17be0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
17bf0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
17c00 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
17c10 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
17c20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
17c30 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
17c40 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
17c50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
17c60 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
17c70 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
17c80 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
17c90 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
17ca0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
17cb0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
17cc0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
17cd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17ce0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
17cf0 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
17d00 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
17d10 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c  e3pager_stmt_rol
17d20 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
17d30 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
17d40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17d50 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54  mtInUse ){.    T
17d60 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
17d70 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67  BACK %d\n", pPag
17d80 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69  er->fd.h);.    i
17d90 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
17da0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
17db0 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  *pPg;.      for(
17dc0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
17dd0 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  t; pPg; pPg=pPg-
17de0 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
17df0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
17e00 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
17e10 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
17e20 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
17e30 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
17e40 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
17e50 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
17e60 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d  Pg), pHist->pStm
17e70 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t, pPager->pageS
17e80 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
17e90 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
17ea0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
17eb0 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
17ec0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
17ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
17ee0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
17ef0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
17f00 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  .      memoryTru
17f10 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
17f20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17f30 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
17f40 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
17f50 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
17f60 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
17f70 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
17f80 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65  tmt_commit(pPage
17f90 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
17fa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17fb0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
17fc0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
17fd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17fe0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17ff0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
18000 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18010 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
18020 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
18030 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  r_filename(Pager
18040 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
18050 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
18060 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
18070 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
18080 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
18090 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
180a0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
180b0 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50  3pager_dirname(P
180c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
180d0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
180e0 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
180f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18100 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
18110 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18120 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
18130 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a   *sqlite3pager_j
18140 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
18150 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
18160 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
18170 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rnal;.}../*.** S
18180 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
18190 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
181a0 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
181b0 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61  _set_codec(.  Pa
181c0 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
181d0 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f  oid (*xCodec)(vo
181e0 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
181f0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
18200 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
18210 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
18220 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
18230 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
18240 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  cArg;.}../*.** T
18250 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
18260 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
18270 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
18280 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
18290 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
182a0 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
182b0 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
182c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
182d0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
182e0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
182f0 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67  r){.  void *pPag
18300 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  e;.  PgHdr *pPgH
18310 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
18320 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
18330 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70  rc;..  /* Open p
18340 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
18350 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
18360 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
18370 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
18380 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , 1, &pPage);.  
18390 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
183a0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
183b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
183c0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
183d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
183e0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
183f0 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
18400 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
18410 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  t byte 24. */.  
18420 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f  pPgHdr = DATA_TO
18430 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20  _PGHDR(pPage);. 
18440 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
18450 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
18460 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20  (pPgHdr, 24);.. 
18470 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
18480 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
18490 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
184a0 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
184b0 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
184c0 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32  ter++;.  store32
184d0 62 69 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e  bits(change_coun
184e0 74 65 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29  ter, pPgHdr, 24)
184f0 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  ;..  /* Release 
18500 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
18510 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ce. */.  sqlite3
18520 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
18530 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
18540 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18550 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
18560 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
18570 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
18580 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
18590 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
185a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
185b0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
185c0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
185d0 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
185e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
185f0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
18600 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
18610 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
18620 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
18630 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
18640 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
18650 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
18660 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
18670 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
18680 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
18690 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
186a0 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
186b0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
186c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
186d0 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
186e0 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
186f0 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
18700 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
18710 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
18720 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
18730 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
18740 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
18750 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
18760 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
18770 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
18780 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
18790 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
187a0 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
187b0 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65  o an sqlite3page
187c0 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a  r_sync() call..*
187d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
187e0 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  er_sync(Pager *p
187f0 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
18800 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
18810 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18820 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  K;..  /* If this
18830 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
18840 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
18850 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
18860 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
18870 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
18880 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
18890 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
188a0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
188b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
188c0 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
188d0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26  pPager->memDb &&
188e0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
188f0 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
18900 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
18910 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
18920 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f  alOpen );..    /
18930 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
18940 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
18950 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
18960 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
18970 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
18980 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
18990 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
189a0 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
189b0 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
189c0 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
189d0 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
189e0 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
189f0 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
18a00 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
18a10 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
18a20 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
18a30 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
18a40 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
18a50 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
18a60 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
18a70 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
18a80 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
18a90 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
18aa0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
18ab0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
18ac0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
18ad0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
18ae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18af0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
18b00 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
18b10 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
18b20 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
18b30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18b40 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
18b50 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
18b60 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
18b70 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18b80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18b90 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
18ba0 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  it;.    }..    /
18bb0 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
18bc0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
18bd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
18be0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
18bf0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
18c00 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
18c10 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
18c20 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
18c30 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18c40 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
18c50 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
18c60 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
18c70 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
18c80 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
18c90 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
18ca0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
18cb0 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
18cc0 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d    }..    pPager-
18cd0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
18ce0 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63  YNCED;.  }..sync
18cf0 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20  _exit:.  return 
18d00 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
18d10 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
18d20 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
18d30 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
18d40 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
18d50 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66  t state of the f
18d60 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65  ile lock for the
18d70 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
18d80 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
18d90 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c  e is one of NO_L
18da0 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  OCK, SHARED_LOCK
18db0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c  , RESERVED_LOCK,
18dc0 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  .** PENDING_LOCK
18dd0 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  , or EXCLUSIVE_L
18de0 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  OCK..*/.int sqli
18df0 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61  te3pager_locksta
18e00 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
18e10 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53  ){.#ifdef OS_TES
18e20 54 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  T.  return pPage
18e30 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79  r->fd->fd.lockty
18e40 70 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  pe;.#else.  retu
18e50 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c 6f  rn pPager->fd.lo
18e60 63 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 7d  cktype;.#endif.}
18e70 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
18e80 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
18e90 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
18ea0 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
18eb0 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
18ec0 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
18ed0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
18ee0 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
18ef0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
18f00 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
18f10 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
18f20 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
18f30 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
18f40 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
18f50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
18f60 70 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  printf("PAGE %3d
18f70 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65   addr=0x%08x nRe
18f80 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
18f90 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74   pPg->pgno, (int
18fa0 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
18fb0 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
18fc0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a        .  }.}.#endif.