/ Hex Artifact Content
Login

Artifact 5f8cdc92ee9efb5a7849dc8b561b53122b700c78:


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: 39 20 32 30 30 34 2f 30 36 2f 33 30 20 31 31 3a  9 2004/06/30 11:
0360: 35 34 3a 30 37 20 64 61 6e 69 65 6c 6b 31 39 37  54:07 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 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-16-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 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a  len+1);.  if( !*
4560: 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  pzMaster ){.    
4570: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
4580: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
4590: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
45a0: 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20  rnl, *pzMaster, 
45b0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
45c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
45d0: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
45e0: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
45f0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  aster = 0;.    r
4600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
4610: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
4620: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
4630: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
4640: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
4650: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
4660: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
4670: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a  (*pzMaster)[i];.
4680: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
4690: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
46a0: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
46b0: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
46c0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
46d0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
46e0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
46f0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
4700: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
4710: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
4720: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
4730: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
4740: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
4750: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
4760: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
4770: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
4780: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
4790: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
47a0: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
47b0: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
47c0: 20 30 3b 0a 20 20 7d 0a 20 20 28 2a 70 7a 4d 61   0;.  }.  (*pzMa
47d0: 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ster)[len] = '\0
47e0: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
47f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4800: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
4810: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
4820: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
4830: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
4840: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
4850: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
4860: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
4870: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
4880: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
4890: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
48a0: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
48b0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
48c0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
48d0: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
48e0: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
48f0: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
4900: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4940: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4960: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
4990: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
49a0: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
49b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
49c0: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  ekJournalHdr(Pag
49d0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f  er *pPager){.  o
49e0: 66 66 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 3b  ff_t offset = 0;
49f0: 0a 20 20 6f 66 66 5f 74 20 63 20 3d 20 70 50 61  .  off_t c = pPa
4a00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
4a10: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
4a20: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
4a30: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
4a40: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
4a50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
4a60: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
4a70: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
4a80: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4a90: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
4aa0: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
4ab0: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
4ac0: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
4ad0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
4ae0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
4af0: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72  ff = offset;.  r
4b00: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53  eturn sqlite3OsS
4b10: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
4b20: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
4b30: 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lOff);.}../*.** 
4b40: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
4b50: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
4b60: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
4b70: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
4b80: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
4b90: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
4ba0: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
4bb0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
4bc0: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
4bd0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
4be0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
4bf0: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
4c00: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
4c10: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
4c20: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
4c30: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
4c40: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
4c50: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
4c60: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
4c70: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
4c80: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
4c90: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
4ca0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
4cb0: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
4cc0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
4cd0: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
4ce0: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
4cf0: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
4d00: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
4d10: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
4d20: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
4d30: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
4d40: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
4d50: 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73  R_SZ - 24) bytes
4d60: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
4d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4d80: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
4d90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
4da0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 65 65 6b  .  int rc = seek
4db0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
4dc0: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
4dd0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61  eturn rc;..  pPa
4de0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
4df0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
4e00: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 70 50 61 67  lOff;.  if( pPag
4e10: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d  er->stmtHdrOff==
4e20: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
4e30: 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50  >stmtHdrOff = pP
4e40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
4e50: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
4e60: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
4e70: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
4e80: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20  ger);..  /* FIX 
4e90: 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50  ME: .  **.  ** P
4ea0: 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61  ossibly for a pa
4eb0: 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79  ger not in no-sy
4ec0: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
4ed0: 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c  rnal magic shoul
4ee0: 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72  d not.  ** be wr
4ef0: 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63  itten until nRec
4f00: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73   is filled in as
4f10: 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79   part of next sy
4f20: 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20  ncJournal(). .  
4f30: 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
4f40: 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65   maybe the whole
4f50: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
4f60: 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65  should be delaye
4f70: 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a  d until that.  *
4f80: 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61  * point. Think a
4f90: 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  bout this..  */.
4fa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
4fb0: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
4fc0: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
4fd0: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
4fe0: 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 69 66  alMagic));..  if
4ff0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5000: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 52  ){.    /* The nR
5010: 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46  ec Field. 0xFFFF
5020: 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63  FFFF for no-sync
5030: 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
5040: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
5050: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
5060: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
5070: 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
5080: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
5090: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
50a0: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
50b0: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
50c0: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20 20 73  aliser */ .    s
50d0: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
50e0: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
50f0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
5100: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
5110: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
5120: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5130: 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  fd, pPager->cksu
5140: 6d 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69 66  mInit);.  }.  if
5150: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5160: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  ){.    /* The in
5170: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
5180: 69 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ize */.    rc = 
5190: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
51a0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
51b0: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ->dbSize);.  }. 
51c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
51d0: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
51e0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
51f0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
5200: 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 63 20  ocess */.    rc 
5210: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
5220: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5230: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
5240: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  .  }..  /* The j
5250: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61  ournal header ha
5260: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73  s been written s
5270: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65  uccessfully. See
5280: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  k the journal.  
5290: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
52a0: 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
52b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
52c0: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
52d0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
52e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
52f0: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
5300: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5310: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20  journalOff-1);. 
5320: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
5330: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
5340: 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b  jfd, "\000", 1);
5350: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
5370: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
5380: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
5390: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
53a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
53b0: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
53c0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
53d0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
53e0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
53f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
5400: 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d  * file. See comm
5410: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
5420: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
5430: 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63  Hdr() for a desc
5440: 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ription of.** th
5450: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
5460: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
5470: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
5480: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
5490: 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20  y, *nRec is set 
54a0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
54b0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
54c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
54d0: 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69  header and *dbSi
54e0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
54f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
5500: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
5510: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5520: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
5530: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
5540: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
5550: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
5560: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
5570: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
5580: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
5590: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
55a0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
55b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
55c0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
55d0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
55e0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
55f0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e   returned and *n
5600: 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  Rec and *dbSize 
5610: 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66  are not set.  If
5620: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
5630: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
5640: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
5650: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
5660: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
5670: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
5680: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
5690: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
56a0: 70 50 61 67 65 72 2c 20 0a 20 20 6f 66 66 5f 74  pPager, .  off_t
56b0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20   journalSize,.  
56c0: 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75  u32 *pNRec, .  u
56d0: 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20  32 *pDbSize.){. 
56e0: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
56f0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5700: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
5710: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
5720: 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72  c header */..  r
5730: 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  c = seekJournalH
5740: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  dr(pPager);.  if
5750: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
5760: 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
5770: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52  >journalOff+JOUR
5780: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5790: 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65  r) > journalSize
57a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
57b0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
57c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
57d0: 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a  sRead(&pPager->j
57e0: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
57f0: 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69  of(aMagic));.  i
5800: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5810: 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  c;..  if( memcmp
5820: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
5830: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
5840: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
5850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5860: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
5870: 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50  = read32bits(&pP
5880: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63  ager->jfd, pNRec
5890: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
58a0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
58b0: 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61   read32bits(&pPa
58c0: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
58d0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
58e0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
58f0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
5900: 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  d32bits(&pPager-
5910: 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a  >jfd, pDbSize);.
5920: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
5930: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  n rc;..  /* Upda
5940: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
5950: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
5960: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
5970: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20  ed by .  ** the 
5980: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
5990: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
59a0: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
59b0: 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61  al was.  ** crea
59c0: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
59d0: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
59e0: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
59f0: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
5a00: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
5a10: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
5a20: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
5a30: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ocal value.  ** 
5a40: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
5a50: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
5a60: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
5a70: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  at routine..  */
5a80: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
5a90: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
5aa0: 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d   (u32 *)&pPager-
5ab0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
5ac0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
5ad0: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
5ae0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
5af0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5b00: 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  er);.  rc = sqli
5b10: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
5b20: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5b30: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72  journalOff);.  r
5b40: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
5b50: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
5b60: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
5b70: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
5b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b90: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
5ba0: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
5bb0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
5bc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5bd0: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
5be0: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
5bf0: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
5c00: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
5c10: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
5c20: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
5c30: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
5c40: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
5c50: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
5c60: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
5c70: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
5c80: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
5c90: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
5ca0: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
5cb0: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
5cc0: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
5cd0: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
5ce0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
5cf0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
5d00: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
5d10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5d20: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
5d30: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
5d40: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
5d50: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
5d60: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
5d70: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
5d80: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
5d90: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
5da0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  al name..*/.stat
5db0: 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
5dc0: 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
5dd0: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
5de0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
5df0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
5e00: 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20  en; .  int i; . 
5e10: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
5e20: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
5e30: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
5e40: 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51  aster) return SQ
5e50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
5e60: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
5e70: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
5e80: 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  n(zMaster);.  fo
5e90: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
5ea0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
5eb0: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
5ec0: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
5ed0: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
5ee0: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
5ef0: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
5f00: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
5f10: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
5f20: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
5f30: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
5f40: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
5f50: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
5f60: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
5f70: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
5f80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
5f90: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
5fa0: 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75      rc = seekJou
5fb0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
5fc0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
5fd0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5fe0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
5ff0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
6000: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
6010: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
6020: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45  Pager->jfd, PAGE
6030: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
6040: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
6050: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6060: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
6070: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
6080: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
6090: 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  r, len);.  if( r
60a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
60b0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
60c0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
60d0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65 6e 29  Pager->jfd, len)
60e0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
60f0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
6100: 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  c;..  rc = write
6110: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
6120: 6a 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69  jfd, cksum);.  i
6130: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6140: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6150: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
6160: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
6170: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
6180: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
6190: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 65 74 75  lMagic));.  retu
61a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
61b0: 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20  Add or remove a 
61c0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  page from the li
61d0: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
61e0: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a  that are in the.
61f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
6200: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
6210: 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65  Pager keeps a se
6220: 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70  parate list of p
6230: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75  ages that are cu
6240: 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68  rrently in.** th
6250: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
6260: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
6270: 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65   the sqlite3page
6280: 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a  r_stmt_commit().
6290: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
62a0: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
62b0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
62c0: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
62d0: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
62e0: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
62f0: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
6300: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
6310: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
6320: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
6330: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
6340: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
6350: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
6360: 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
6370: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
6380: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
6390: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
63a0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  pPg->pNextStmt==
63b0: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  0 );.  pPg->pPre
63c0: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  vStmt = 0;.  if(
63d0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29   pPager->pStmt )
63e0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  {.    pPager->pS
63f0: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
6400: 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
6410: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
6420: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50  ger->pStmt;.  pP
6430: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
6440: 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  g;.  pPg->inStmt
6450: 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 1;.}.static v
6460: 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f  oid page_remove_
6470: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50  from_stmt_list(P
6480: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
6490: 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  ( !pPg->inStmt )
64a0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
64b0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b  Pg->pPrevStmt ){
64c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
64d0: 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65  ->pPrevStmt->pNe
64e0: 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  xtStmt==pPg );. 
64f0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
6500: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  t->pNextStmt = p
6510: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
6520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6530: 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
6540: 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  >pStmt==pPg );. 
6550: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
6560: 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pStmt = pPg->pNe
6570: 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66  xtStmt;.  }.  if
6580: 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  ( pPg->pNextStmt
6590: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
65a0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e  pPg->pNextStmt->
65b0: 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29  pPrevStmt==pPg )
65c0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
65d0: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
65e0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  = pPg->pPrevStmt
65f0: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
6600: 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  xtStmt = 0;.  pP
6610: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
6620: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
6630: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  = 0;.}../*.** Fi
6640: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
6650: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
6660: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
6670: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
6680: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
6690: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
66a0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
66b0: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
66c0: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
66d0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
66e0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
66f0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61  pPager->aHash[pa
6700: 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b  ger_hash(pgno)];
6710: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
6720: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
6730: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
6740: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
6750: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
6760: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
6770: 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  se and clear the
6780: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
6790: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
67a0: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
67b0: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
67c0: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
67d0: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
67e0: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
67f0: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
6800: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
6810: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
6820: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
6830: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
6840: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
6850: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
6860: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
6870: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
6880: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
6890: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
68a0: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  g, *pNext;.  for
68b0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
68c0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
68d0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
68e0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
68f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
6900: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
6910: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
6920: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
6930: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
6940: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
6950: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
6960: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  0;.  memset(pPag
6970: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
6980: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
6990: 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  sh));.  pPager->
69a0: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  nPage = 0;.  if(
69b0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
69c0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
69d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  {.    sqlite3pag
69e0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
69f0: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
6a00: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
6a10: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
6a20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
6a30: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
6a40: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
6a50: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
6a60: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61  r->nRef = 0;.  a
6a70: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
6a80: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
6a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
6aa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6ab0: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
6ac0: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
6ad0: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
6ae0: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
6af0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
6b00: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
6b10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
6b20: 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61  leases.** the da
6b30: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
6b40: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
6b50: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
6b60: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
6b70: 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c  l.** file is del
6b80: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
6b90: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
6ba0: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
6bb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
6bc0: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
6bd0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
6be0: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
6bf0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
6c00: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
6c10: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
6c20: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
6c30: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
6c40: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
6c50: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
6c60: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
6c70: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
6c80: 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20  *pPg;.  assert( 
6c90: 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
6ca0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
6cb0: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
6cc0: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
6cd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6ce0: 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  }.  sqlite3pager
6cf0: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61  _stmt_commit(pPa
6d00: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
6d10: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
6d20: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
6d30: 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
6d40: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
6d50: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
6d60: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
6d70: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
6d80: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
6d90: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
6da0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
6db0: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
6dc0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
6dd0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
6de0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
6df0: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
6e00: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
6e10: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
6e20: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
6e30: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
6e40: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
6e50: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
6e60: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
6e70: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
6e80: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
6e90: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
6ea0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
6eb0: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
6ec0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
6ed0: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
6ee0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
6ef0: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
6f00: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
6f10: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
6f20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
6f30: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
6f40: 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
6f50: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
6f60: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
6f70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  ;.  pPager->orig
6f80: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  DbSize = 0;.  pP
6f90: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
6fa0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
6fb0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6fc0: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
6fd0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
6fe0: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
6ff0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
7000: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
7010: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
7020: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
7030: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
7040: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
7050: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
7060: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
7070: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
7080: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
7090: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
70a0: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
70b0: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
70c0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
70d0: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
70e0: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
70f0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
7100: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
7110: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
7120: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
7130: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
7140: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
7150: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
7160: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
7170: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
7180: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
7190: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
71a0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
71b0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
71c0: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
71d0: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
71e0: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
71f0: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
7200: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
7210: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
7220: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
7230: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
7240: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
7250: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
7260: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
7270: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
7280: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
7290: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
72a0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
72b0: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
72c0: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
72d0: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
72e0: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
72f0: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
7300: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
7310: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
7320: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
7330: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
7340: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
7350: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
7360: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
7370: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
7380: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
7390: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
73a0: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
73b0: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
73c0: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
73d0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
73e0: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
73f0: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63  er, Pgno pgno, c
7400: 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74 61  onst char *aData
7410: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
7420: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
7430: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
7440: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
7450: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
7460: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
7470: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
7480: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
7490: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
74a0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
74b0: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
74c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
74d0: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
74e0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
74f0: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
7500: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
7510: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
7520: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
7530: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
7540: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
7550: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
7560: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
7570: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
7580: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
7590: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
75a0: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
75b0: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
75c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
75d0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
75e0: 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a  one_page(Pager *
75f0: 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a  pPager, OsFile *
7600: 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75  jfd, int useCksu
7610: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
7620: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7640: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
7650: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
7660: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7680: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
7690: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
76a0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
76b0: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
76d0: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
76e0: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
76f0: 67 20 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b  g */.  u8 aData[
7700: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
7710: 5d 3b 20 20 20 2f 2a 20 53 74 6f 72 65 20 64 61  ];   /* Store da
7720: 74 61 20 68 65 72 65 20 2a 2f 0a 0a 20 20 72 63  ta here */..  rc
7730: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
7740: 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  d, &pgno);.  if(
7750: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7760: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
7770: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
7780: 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70 50  (jfd, &aData, pP
7790: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
77a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
77b0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
77c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
77d0: 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
77e0: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a  ->pageSize + 4;.
77f0: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
7800: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
7810: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
7820: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
7830: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
7840: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
7850: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
7860: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
7870: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
7880: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
7890: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
78a0: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
78b0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
78c0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
78d0: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
78e0: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
78f0: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
7900: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
7910: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
7920: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
7930: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
7940: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
7950: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7960: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
7970: 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65  f( pgno>(unsigne
7980: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
7990: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
79a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
79b0: 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a  if( useCksum ){.
79c0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
79d0: 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29  its(jfd, &cksum)
79e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
79f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
7a00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7a10: 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70   += 4;.    if( p
7a20: 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
7a30: 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 21  r, pgno, aData)!
7a40: 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
7a50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
7a60: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
7a70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7a80: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
7a90: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
7aa0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
7ab0: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
7ac0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
7ad0: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
7ae0: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
7af0: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
7b00: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
7b10: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
7b20: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
7b30: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
7b40: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
7b50: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
7b60: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
7b70: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
7b80: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
7b90: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
7ba0: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
7bb0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
7bc0: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
7bd0: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
7be0: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
7bf0: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
7c00: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
7c10: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
7c20: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
7c30: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
7c40: 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74   pgno);.  assert
7c50: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
7c60: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
7c70: 20 7c 7c 20 70 50 67 20 29 3b 0a 20 20 54 52 41   || pPg );.  TRA
7c80: 43 45 32 28 22 50 4c 41 59 42 41 43 4b 20 70 61  CE2("PLAYBACK pa
7c90: 67 65 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 29 3b  ge %d\n", pgno);
7ca0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
7cb0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
7cc0: 55 53 49 56 45 20 29 7b 0a 20 20 20 20 73 71 6c  USIVE ){.    sql
7cd0: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
7ce0: 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
7cf0: 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50  *(off_t)SQLITE_P
7d00: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 72  AGE_SIZE);.    r
7d10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
7d20: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
7d30: 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41  aData, SQLITE_PA
7d40: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a 20 20  GE_SIZE);.  }.  
7d50: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
7d60: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
7d70: 20 65 76 65 72 20 62 65 20 72 6f 6c 6c 65 64 20   ever be rolled 
7d80: 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
7d90: 75 73 65 2c 20 65 78 63 65 70 74 20 66 6f 72 20  use, except for 
7da0: 70 61 67 65 0a 20 20 20 20 2a 2a 20 31 20 77 68  page.    ** 1 wh
7db0: 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
7dc0: 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
7dd0: 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
7de0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
7df0: 20 2a 2a 20 61 63 74 69 76 65 2e 0a 20 20 20 20   ** active..    
7e00: 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
7e10: 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
7e20: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
7e30: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  pPg->pgno==1 );.
7e40: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
7e50: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
7e60: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
7e70: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
7e80: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
7e90: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
7ea0: 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a  tructor ){  /***
7eb0: 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64   FIX ME:  Should
7ec0: 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74   this be xReinit
7ed0: 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61  ? ***/.      pPa
7ee0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
7ef0: 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  (pData, pPager->
7f00: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
7f10: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
7f20: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
7f30: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
7f40: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
7f50: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
7f60: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
7f70: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
7f80: 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
7f90: 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65  no, 3);.  }.  re
7fa0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7fb0: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
7fc0: 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
7fd0: 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
7fe0: 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
7ff0: 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
8000: 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
8010: 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
8020: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
8030: 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
8040: 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
8050: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
8060: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
8070: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
8080: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8090: 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
80a0: 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
80b0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
80c0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
80d0: 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
80e0: 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  all child journa
80f0: 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69  ls..** To tell i
8100: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
8110: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
8120: 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68  d, check to each
8130: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64   of the.** child
8140: 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69  ren.  If all chi
8150: 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72  ldren are either
8160: 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e   missing or do n
8170: 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61  ot refer to.** a
8180: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
8190: 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  r journal, then 
81a0: 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72  this master jour
81b0: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
81c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
81d0: 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
81e0: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  r(const char *zM
81f0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
8200: 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f  ;.  int master_o
8210: 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c  pen = 0;.  OsFil
8220: 65 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72  e master;.  char
8230: 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
8240: 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
8250: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
8260: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 6f 66  nal file */.  of
8270: 66 5f 74 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  f_t nMasterJourn
8280: 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  al;     /* Size 
8290: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
82a0: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
82b0: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
82c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63  journal file exc
82d0: 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65  lusively in case
82e0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
82f0: 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e  ess.  ** is runn
8300: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
8310: 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20   also. Not that 
8320: 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63  it makes too muc
8330: 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  h difference..  
8340: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61 73  */.  memset(&mas
8350: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  ter, 0, sizeof(m
8360: 61 73 74 65 72 29 29 3b 0a 20 20 72 63 20 3d 20  aster));.  rc = 
8370: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
8380: 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26  dOnly(zMaster, &
8390: 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72  master);.  if( r
83a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
83b0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
83c0: 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e  t;.  master_open
83d0: 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
83e0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
83f0: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
8400: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
8410: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8420: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
8430: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
8440: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
8450: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
8460: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
8470: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
8480: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
8490: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
84a0: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
84b0: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
84c0: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
84d0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
84e0: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
84f0: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
8500: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
8510: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
8520: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
8530: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
8540: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
8550: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
8560: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
8570: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
8580: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
8590: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
85a0: 33 4f 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c  3OsRead(&master,
85b0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
85c0: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29   nMasterJournal)
85d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
85e0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
85f0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
8600: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
8610: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
8620: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
8630: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
8640: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
8650: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  l ){.      if( s
8660: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
8670: 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  ts(zJournal) ){.
8680: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
8690: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
86a0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
86b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
86c0: 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
86d0: 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
86e0: 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
86f0: 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
8700: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
8710: 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
8720: 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
8730: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
8740: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
8750: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f      */.        O
8760: 73 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 0a  sFile journal;..
8770: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
8780: 6a 6f 75 72 6e 61 6c 2c 20 30 2c 20 73 69 7a 65  journal, 0, size
8790: 6f 66 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20  of(journal));.  
87a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
87b0: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
87c0: 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72  (zJournal, &jour
87d0: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
87e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
87f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
8800: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
8810: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
8820: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
8830: 74 65 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75 72  terJournal(&jour
8840: 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72  nal, &zMasterPtr
8850: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8860: 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e  e3OsClose(&journ
8870: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
8880: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8890: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
88a0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
88b0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
88c0: 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 50 74     if( zMasterPt
88d0: 72 20 26 26 20 21 73 74 72 63 6d 70 28 7a 4d 61  r && !strcmp(zMa
88e0: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
88f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
8900: 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
8910: 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
8920: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8930: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
8940: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
8950: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
8960: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8970: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
8980: 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29  strlen(zJournal)
8990: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
89a0: 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c   .  sqlite3OsDel
89b0: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64  ete(zMaster);..d
89c0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
89d0: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
89e0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
89f0: 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  Free(zMasterJour
8a00: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
8a10: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
8a20: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
8a30: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
8a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8a50: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65  ../*.** Make eve
8a60: 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ry page in the c
8a70: 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20  ache agree with 
8a80: 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
8a90: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
8aa0: 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20  ,.** reread the 
8ab0: 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68  disk to reset th
8ac0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
8ad0: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
8ae0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8af0: 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62  ed after a rollb
8b00: 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d  ack in which som
8b10: 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63  e of the dirty c
8b20: 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61  ache.** pages ha
8b30: 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  d never been wri
8b40: 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tten out to disk
8b50: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
8b60: 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63  ll back the.** c
8b70: 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64  ache content and
8b80: 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79   the easiest way
8b90: 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74   to do that is t
8ba0: 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64  o reread the old
8bb0: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b   content.** back
8bc0: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a   from the disk..
8bd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
8be0: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
8bf0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8c00: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
8c10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8c20: 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  _OK;.  for(pPg=p
8c30: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
8c40: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
8c50: 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  All){.    char z
8c60: 42 75 66 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f  Buf[SQLITE_PAGE_
8c70: 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20 21  SIZE];.    if( !
8c80: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
8c90: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
8ca0: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
8cb0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
8cc0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
8cd0: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
8ce0: 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50  er->fd, SQLITE_P
8cf0: 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29  AGE_SIZE*(off_t)
8d00: 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a  (pPg->pgno-1));.
8d10: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8d20: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
8d30: 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 53 51 4c 49  ->fd, zBuf, SQLI
8d40: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
8d50: 20 20 20 20 20 54 52 41 43 45 32 28 22 52 45 46       TRACE2("REF
8d60: 45 54 43 48 20 70 61 67 65 20 25 64 5c 6e 22 2c  ETCH page %d\n",
8d70: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
8d80: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
8d90: 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   zBuf, pPg->pgno
8da0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 2);.      if( 
8db0: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
8dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
8dd0: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 53 51 4c  set(zBuf, 0, SQL
8de0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
8df0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
8e00: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65  g->nRef==0 || me
8e10: 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52  mcmp(zBuf, PGHDR
8e20: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53  _TO_DATA(pPg), S
8e30: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
8e40: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
8e50: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
8e60: 50 67 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54  Pg), zBuf, SQLIT
8e70: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
8e80: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8e90: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
8ea0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
8eb0: 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f  initer(PGHDR_TO_
8ec0: 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
8ed0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
8ee0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ef0: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
8f00: 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30  TO_EXTRA(pPg), 0
8f10: 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
8f20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8f30: 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
8f40: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  nc = 0;.    pPg-
8f50: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
8f60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8f70: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
8f80: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
8f90: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
8fa0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
8fb0: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
8fc0: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
8fd0: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
8fe0: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
8ff0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
9000: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
9010: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
9020: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
9030: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
9040: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
9050: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
9060: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
9070: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
9080: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
9090: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
90a0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
90b0: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
90c0: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
90d0: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
90e0: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
90f0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
9100: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
9110: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
9120: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
9130: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
9140: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
9150: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
9160: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
9170: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
9180: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
9190: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
91a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
91b0: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
91c0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
91d0: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
91e0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
91f0: 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  5)  4 byte integ
9200: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
9210: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9220: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
9230: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
9240: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
9250: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
9260: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
9270: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
9280: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
9290: 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65  .**  (6)  N byte
92a0: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
92b0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
92c0: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
92d0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
92e0: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
92f0: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
9300: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
9310: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
9320: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
9330: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
9340: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
9350: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
9360: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
9370: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
9380: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
9390: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
93a0: 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20  ..**  (7)  Zero 
93b0: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
93c0: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
93d0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
93e0: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
93f0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
9400: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
9410: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
9420: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
9430: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
9440: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
9450: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
9460: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
9470: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
9480: 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 6 items above.
9490: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
94a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
94b0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
94c0: 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 7th item..**
94d0: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
94e0: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
94f0: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
9500: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
9510: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
9520: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
9530: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
9540: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
9550: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
9560: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
9570: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
9580: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
9590: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
95a0: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
95b0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
95c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
95d0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
95e0: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
95f0: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
9600: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
9610: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
9620: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
9630: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
9640: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
9650: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
9660: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
9670: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
9680: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
9690: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
96a0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
96b0: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
96c0: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
96d0: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
96e0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
96f0: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
9700: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
9710: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
9720: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
9730: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
9740: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
9750: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
9760: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
9770: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
9780: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
9790: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
97a0: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
97b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
97c0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
97d0: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
97e0: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
97f0: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
9800: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
9810: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
9820: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
9830: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
9840: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
9850: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
9860: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
9870: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
9880: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9890: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
98a0: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
98b0: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
98c0: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
98d0: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
98e0: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
98f0: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
9900: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
9910: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
9920: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
9930: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
9940: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
9950: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
9960: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
9970: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
9980: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
9990: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
99a0: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
99b0: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
99c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
99d0: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
99e0: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
99f0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
9a00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
9a10: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
9a20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
9a30: 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20    off_t szJ;    
9a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9a50: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
9a60: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
9a70: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a90: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
9aa0: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
9ab0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
9ae0: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
9af0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
9b00: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
9b10: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
9b20: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b40: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
9b50: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
9b60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
9b70: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
9b80: 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
9b90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
9ba0: 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
9bb0: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
9bc0: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
9bd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
9be0: 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
9bf0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
9c00: 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
9c10: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9c20: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
9c30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
9c40: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
9c50: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
9c60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9c70: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
9c80: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
9c90: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
9ca0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9cb0: 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
9cc0: 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
9cd0: 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
9ce0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9cf0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
9d00: 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
9d10: 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
9d20: 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
9d30: 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
9d40: 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
9d50: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
9d60: 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
9d70: 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63   back..  */.  rc
9d80: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
9d90: 72 6e 61 6c 28 26 70 50 61 67 65 72 2d 3e 6a 66  rnal(&pPager->jf
9da0: 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20  d, &zMaster);.  
9db0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9dc0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
9dd0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
9de0: 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73  | (zMaster && !s
9df0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
9e00: 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a  ts(zMaster)) ){.
9e10: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
9e20: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
9e30: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
9e40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
9e50: 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
9e60: 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  OK;.    goto end
9e70: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
9e80: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
9e90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
9ea0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9eb0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a  alOff = 0;..  /*
9ec0: 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
9ed0: 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
9ee0: 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61  n the readJourna
9ef0: 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75  lHdr() call retu
9f00: 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  rns.  ** SQLITE_
9f10: 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
9f20: 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
9f30: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20   while( 1 ){..  
9f40: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
9f50: 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
9f60: 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
9f70: 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
9f80: 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
9f90: 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
9fa0: 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
9fb0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
9fc0: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
9fd0: 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
9fe0: 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
9ff0: 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
a000: 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
a010: 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
a020: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
a030: 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
a040: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
a050: 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
a060: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
a070: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
a080: 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
a090: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
a0a0: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
a0b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a0c0: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
a0d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
a0f0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
a100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
a110: 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
a120: 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
a130: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
a140: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
a150: 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
a160: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
a170: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
a180: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
a190: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
a1a0: 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
a1b0: 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
a1c0: 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
a1d0: 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
a1e0: 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
a1f0: 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
a200: 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
a210: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
a220: 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
a230: 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
a240: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
a250: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
a260: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a270: 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
a280: 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  = (szJ - JOURNAL
a290: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
a2a0: 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
a2b0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
a2c0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
a2d0: 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
a2e0: 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
a2f0: 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
a300: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
a310: 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
a320: 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c  to it's original
a330: 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
a340: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
a350: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
a360: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a370: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
a380: 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  ( pPager->origDb
a390: 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Size==0 || pPage
a3a0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d  r->origDbSize==m
a3b0: 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20  xPg );.      rc 
a3c0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
a3d0: 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ate(&pPager->fd,
a3e0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
a3f0: 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a  E*(off_t)mxPg);.
a400: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a410: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a420: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
a430: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
a440: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
a450: 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
a460: 0a 0a 20 20 20 20 2f 2a 20 72 63 20 3d 20 73 71  ..    /* rc = sq
a470: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
a480: 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41  ger->jfd, JOURNA
a490: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a4a0: 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ); */.    if( rc
a4b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
a4c0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
a4d0: 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  .  .    /* Copy 
a4e0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
a4f0: 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
a500: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
a510: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
a520: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
a530: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
a540: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
a550: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
a560: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
a570: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29  &pPager->jfd, 1)
a580: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
a590: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a5a0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
a5b0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
a5c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a5d0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
a5e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a5f0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
a600: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a610: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a620: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
a630: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
a640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a650: 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74   }..  /* Pages t
a660: 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  hat have been wr
a670: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
a680: 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73  rnal but never s
a690: 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65  ynced.  ** where
a6a0: 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79   not restored by
a6b0: 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e   the loop above.
a6c0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 73    We have to res
a6d0: 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20  tore those.  ** 
a6e0: 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e 67  pages by reading
a6f0: 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20   them back from 
a700: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
a710: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  abase..  */.  as
a720: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
a730: 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f 72  _OK );.  pager_r
a740: 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
a750: 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  er);..end_playba
a760: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
a770: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
a780: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
a790: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
a7a0: 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72   }.  if( zMaster
a7b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
a7c0: 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
a7d0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
a7e0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
a7f0: 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20  eturn true,.    
a800: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
a810: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
a820: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
a830: 75 72 6e 61 6c 2e 20 49 66 20 65 72 72 6f 72 73  urnal. If errors
a840: 20 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 64   .    ** occur d
a850: 75 72 69 6e 67 20 74 68 69 73 20 70 72 6f 63 65  uring this proce
a860: 73 73 2c 20 69 67 6e 6f 72 65 20 74 68 65 6d 2e  ss, ignore them.
a870: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
a880: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
a890: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 64 65 6c  .      pager_del
a8a0: 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b  master(zMaster);
a8b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a8c0: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
a8d0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
a8e0: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
a8f0: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
a900: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
a910: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
a920: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
a930: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
a940: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
a950: 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54  erent PAGER_SECT
a960: 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c  OR_SIZE.  ** val
a970: 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
a980: 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
a990: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
a9a0: 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ss..  */.  pPage
a9b0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
a9c0: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
a9d0: 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  E;.  return rc;.
a9e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
a9f0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
aa00: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
aa10: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
aa20: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
aa30: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
aa40: 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
aa50: 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
aa60: 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
aa70: 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
aa80: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
aa90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
aaa0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
aab0: 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
aac0: 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  tement is stored
aad0: 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   in pPager->stmt
aae0: 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
aaf0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
ab00: 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
ab10: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
ab20: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
ab30: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73  aying back the s
ab40: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
ab50: 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20  , also.**       
ab60: 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70    playback all p
ab70: 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e  ages of the tran
ab80: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
ab90: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20  beginning.**    
aba0: 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70       at offset p
abb0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
abc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
abd0: 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
abe0: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
abf0: 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b  r){.  off_t szJ;
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac10: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
ac20: 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
ac30: 6f 66 66 5f 74 20 68 64 72 4f 66 66 3b 0a 20 20  off_t hdrOff;.  
ac40: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
ac50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ac60: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f  er of Records */
ac70: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
ac90: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
aca0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20   int rc;..  szJ 
acb0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
acc0: 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44  lOff;.#ifndef ND
acd0: 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 6f 66  EBUG .  {.    of
ace0: 66 5f 74 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  f_t os_szJ;.    
acf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
ad00: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
ad10: 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20  jfd, &os_szJ);. 
ad20: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ad30: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
ad40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
ad50: 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d  J==os_szJ );.  }
ad60: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
ad70: 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74  t hdrOff to be t
ad80: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
ad90: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
ada0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 0a 20 20  eader written.  
adb0: 2a 2a 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ** this statemen
adc0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  t transaction, o
add0: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
ade0: 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72   file if no jour
adf0: 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  nal.  ** header 
ae00: 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a  was written..  *
ae10: 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61  /.  hdrOff = pPa
ae20: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b  ger->stmtHdrOff;
ae30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ae40: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21  r->fullSync || !
ae50: 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20  hdrOff );.  if( 
ae60: 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68  !hdrOff ){.    h
ae70: 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  drOff = szJ;.  }
ae80: 0a 20 20 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61  .  ..  /* Trunca
ae90: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
aea0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
aeb0: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a  inal size..  */.
aec0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
aed0: 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72  Truncate(&pPager
aee0: 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47  ->fd, SQLITE_PAG
aef0: 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 70 50  E_SIZE*(off_t)pP
af00: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b  ager->stmtSize);
af10: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
af20: 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
af30: 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  Size;..  /* Figu
af40: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
af50: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
af60: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
af70: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
af80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
af90: 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
afa0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
afb0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  .  sqlite3OsSeek
afc0: 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
afd0: 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61  0);.  nRec = pPa
afe0: 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
aff0: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
b000: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
b010: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
b020: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
b030: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
b040: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
b050: 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
b060: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
b070: 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
b080: 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
b090: 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
b0a0: 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
b0b0: 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
b0c0: 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
b0d0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
b0e0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
b0f0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
b100: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
b110: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
b120: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
b130: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->stfd, 0);.    
b140: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
b150: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
b160: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b170: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
b180: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
b190: 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f    /* Now roll so
b1a0: 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72  me pages back fr
b1b0: 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  om the transacti
b1c0: 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65  on journal. Page
b1d0: 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a  r.stmtJSize.  **
b1e0: 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66   was the size of
b1f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b200: 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74  e when this stat
b210: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
b220: 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79  d, so.  ** every
b230: 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74  thing after that
b240: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
b250: 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72  led back, either
b260: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
b270: 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d  atabase, the mem
b280: 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f  ory cache, or bo
b290: 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  th..  **.  ** If
b2a0: 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   it is not zero,
b2b0: 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74   then Pager.stmt
b2c0: 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66  HdrOff is the of
b2d0: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
b2e0: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69  t.  ** of the fi
b2f0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
b300: 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e  er written durin
b310: 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  g this statement
b320: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
b330: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
b340: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
b350: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74  >jfd, pPager->st
b360: 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
b370: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b380: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74  .    goto end_st
b390: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
b3a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
b3b0: 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  alOff = pPager->
b3c0: 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61  stmtJSize;.  pPa
b3d0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d  ger->cksumInit =
b3e0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
b3f0: 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 4a 4f  um;.  assert( JO
b400: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
b410: 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e 70 61  ger)<(pPager->pa
b420: 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77  geSize+8) );.  w
b430: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
b440: 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72  urnalOff <= (hdr
b450: 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70 61 67  Off-(pPager->pag
b460: 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20  eSize+8)) ){.   
b470: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
b480: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
b490: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
b4a0: 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  fd, 1);.    asse
b4b0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
b4c0: 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
b4d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b4e0: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
b4f0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  yback;.  }..  wh
b500: 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
b510: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b  rnalOff < szJ ){
b520: 0a 20 20 20 20 75 33 32 20 6e 52 65 63 3b 0a 20  .    u32 nRec;. 
b530: 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
b540: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
b550: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
b560: 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75 6d 6d 79  J, &nRec, &dummy
b570: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
b580: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b590: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
b5a0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
b5b0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
b5c0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
b5d0: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
b5e0: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
b5f0: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
b600: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
b610: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
b620: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
b630: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
b640: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
b650: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d  nalOff < szJ; i-
b660: 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  -){.      rc = p
b670: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
b680: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
b690: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
b6a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
b6b0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
b6c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
b6d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
b6e0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
b6f0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
b700: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b710: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
b720: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
b730: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b740: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
b750: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
b760: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
b770: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
b780: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c  E_CORRUPT;.  }el
b790: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
b7a0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
b7b0: 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72  ;.    /* pager_r
b7c0: 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
b7d0: 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  er); */.  }.  re
b7e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b7f0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
b800: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
b810: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
b820: 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
b830: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
b840: 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65  um number is the
b850: 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20   absolute value 
b860: 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20 70 61  of the mxPage pa
b870: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d  rameter..** If m
b880: 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
b890: 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c  e, the noSync fl
b8a0: 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20  ag is also set. 
b8b0: 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73   noSync bypasses
b8c0: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
b8d0: 69 74 65 33 4f 73 53 79 6e 63 28 29 2e 20 20 54  ite3OsSync().  T
b8e0: 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75  he pager runs mu
b8f0: 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20 6e  ch faster with n
b900: 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74  oSync on,.** but
b910: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
b920: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
b930: 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e 20   or there is an 
b940: 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a  abrupt power .**
b950: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61   failure, the da
b960: 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68  tabase file migh
b970: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  t be left in an 
b980: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
b990: 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65  .** unrepairable
b9a0: 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69   state.  .*/.voi
b9b0: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
b9c0: 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67  et_cachesize(Pag
b9d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
b9e0: 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
b9f0: 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  xPage>=0 ){.    
ba00: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
ba10: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
ba20: 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
ba30: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
ba40: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
ba50: 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ; .  }else{.    
ba60: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
ba70: 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d   1;.    mxPage =
ba80: 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20   -mxPage;.  }.  
ba90: 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b  if( mxPage>10 ){
baa0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
bab0: 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  age = mxPage;.  
bac0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
bad0: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a  r->mxPage = 10;.
bae0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a    }.}../*.** Adj
baf0: 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
bb00: 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
bb10: 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
bb20: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
bb30: 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
bb40: 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
bb50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
bb60: 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
bb70: 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
bb80: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
bb90: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
bba0: 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
bbb0: 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
bbc0: 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
bbd0: 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
bbe0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
bbf0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
bc00: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
bc10: 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
bc20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
bc30: 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
bc40: 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
bc50: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
bc60: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
bc70: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
bc80: 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
bc90: 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
bca0: 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
bcb0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bcc0: 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
bcd0: 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
bce0: 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
bcf0: 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
bd00: 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
bd10: 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
bd20: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
bd30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
bd50: 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
bd60: 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
bd70: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
bd80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
bd90: 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
bda0: 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
bdb0: 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
bdc0: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
bdd0: 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
bde0: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
bdf0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
be00: 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
be10: 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
be20: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
be30: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
be40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
be50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
be60: 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
be70: 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
be80: 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
be90: 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
bea0: 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
beb0: 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
bed0: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
bee0: 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
bef0: 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
bf00: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
bf10: 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
bf20: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
bf30: 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
bf40: 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
bf50: 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
bf60: 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
bf70: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
bf80: 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
bf90: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ck..**.** Numeri
bfa0: 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
bfb0: 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
bfc0: 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
bfd0: 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
bfe0: 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f  nd FULL=3..*/.vo
bff0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
c000: 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c  set_safety_level
c010: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c020: 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50  int level){.  pP
c030: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
c040: 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
c050: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
c060: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
c070: 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21   = level==3 && !
c080: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c090: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
c0a0: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
c0b0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
c0c0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
c0d0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
c0e0: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
c0f0: 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
c100: 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20  zName.** (zName 
c110: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
c120: 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45   SQLITE_TEMPNAME
c130: 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67  _SIZE bytes long
c140: 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65  .)  Write.** the
c150: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c160: 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
c170: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
c180: 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
c190: 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
c1a0: 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a  ode if we fail..
c1b0: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c  **.** The OS wil
c1c0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
c1d0: 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
c1e0: 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
c1f0: 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a  t is.** closed..
c200: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
c210: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
c220: 65 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c  emp(char *zFile,
c230: 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20   OsFile *fd){.  
c240: 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69  int cnt = 8;.  i
c250: 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20  nt rc;.  do{.   
c260: 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69   cnt--;.    sqli
c270: 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
c280: 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63  e(zFile);.    rc
c290: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
c2a0: 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c  Exclusive(zFile,
c2b0: 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c   fd, 1);.  }whil
c2c0: 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d  e( cnt>0 && rc!=
c2d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
c2e0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
c2f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c300: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
c310: 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61  new page cache a
c320: 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
c330: 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63   to the page cac
c340: 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a  he in *ppPager..
c350: 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62  ** The file to b
c360: 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f  e cached need no
c370: 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69  t exist.  The fi
c380: 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64  le is not locked
c390: 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69   until.** the fi
c3a0: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
c3b0: 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 61  te3pager_get() a
c3c0: 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20  nd is only held 
c3d0: 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a  open until the.*
c3e0: 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  * last page is r
c3f0: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
c400: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
c410: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ()..**.** If zFi
c420: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
c430: 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
c440: 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
c450: 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
c460: 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
c470: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
c480: 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77  hed.  The file w
c490: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  ill be deleted.*
c4a0: 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
c4b0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
c4c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
c4d0: 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50  3pager_open(.  P
c4e0: 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
c4f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c500: 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
c510: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
c520: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
c530: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
c540: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
c550: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
c560: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20  .  int mxPage,  
c570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
c580: 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  ax number of in-
c590: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
c5a0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  es */.  int nExt
c5b0: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
c5c0: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
c5d0: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
c5e0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
c5f0: 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
c600: 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  l,          /* T
c610: 52 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f 6c  RUE to use a rol
c620: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
c630: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
c640: 76 6f 69 64 20 20 2a 70 42 75 73 79 48 61 6e 64  void  *pBusyHand
c650: 6c 65 72 20 20 20 20 20 20 2f 2a 20 42 75 73 79  ler      /* Busy
c660: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a   callback */.){.
c670: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
c680: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61  .  char *zFullPa
c690: 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  thname = 0;.  in
c6a0: 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46  t nameLen;.  OsF
c6b0: 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63  ile fd;.  int rc
c6c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c6d0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d  int i;.  int tem
c6e0: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pFile = 0;.  int
c6f0: 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e   memDb = 0;.  in
c700: 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  t readOnly = 0;.
c710: 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
c720: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
c730: 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72 20  E];..  *ppPager 
c740: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 66  = 0;.  memset(&f
c750: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29  d, 0, sizeof(fd)
c760: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
c770: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
c780: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c790: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
c7a0: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
c7b0: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
c7c0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
c7d0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d  (zFilename,":mem
c7e0: 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ory:")==0 ){.   
c7f0: 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
c800: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
c810: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
c820: 28 22 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ("");.      rc =
c830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c840: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 46 75  }else{.      zFu
c850: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
c860: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
c870: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
c880: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
c890: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
c8a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
c8b0: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
c8c0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
c8d0: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
c8e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
c8f0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
c900: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
c910: 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b  emp(zTemp, &fd);
c920: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
c930: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
c940: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
c950: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
c960: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
c970: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c980: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
c990: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
c9a0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c  .  }.  if( !zFul
c9b0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
c9c0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
c9d0: 26 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  &fd);.    return
c9e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c9f0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
ca00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
ca10: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64  lite3OsClose(&fd
ca20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
ca30: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
ca40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
ca50: 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d  .  }.  nameLen =
ca60: 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74   strlen(zFullPat
ca70: 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72  hname);.  pPager
ca80: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
ca90: 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
caa0: 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33   + nameLen*3 + 3
cab0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
cac0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
cad0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
cae0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
caf0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
cb00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cb10: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53  E_NOMEM;.  }.  S
cb20: 45 54 5f 50 41 47 45 52 28 70 50 61 67 65 72 29  ET_PAGER(pPager)
cb30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
cb40: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
cb50: 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
cb60: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
cb70: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
cb80: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
cb90: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
cba0: 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
cbb0: 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65  Directory[nameLe
cbc0: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
cbd0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
cbe0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
cbf0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
cc00: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  r->zDirectory, z
cc10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
cc20: 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20   for(i=nameLen; 
cc30: 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
cc40: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
cc50: 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
cc60: 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
cc70: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
cc80: 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50  = 0;.  strcpy(pP
cc90: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
cca0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
ccb0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
ccc0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
ccd0: 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  trcpy(&pPager->z
cce0: 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d  Journal[nameLen]
ccf0: 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20  , "-journal");. 
cd00: 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64   pPager->fd = fd
cd10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
cd20: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  nalOpen = 0;.  p
cd30: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
cd40: 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26  l = useJournal &
cd50: 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  & !memDb;.  pPag
cd60: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
cd70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
cd80: 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50 61  InUse = 0;.  pPa
cd90: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20  ger->nRef = 0;. 
cda0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
cdb0: 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
cdc0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
cdd0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
cde0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
cdf0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
ce00: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
ce10: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  0;.  pPager->nPa
ce20: 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ge = 0;.  pPager
ce30: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
ce40: 65 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a 20 31  e>5 ? mxPage : 1
ce50: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  0;.  pPager->sta
ce60: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
ce70: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  K;.  pPager->err
ce80: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  Mask = 0;.  pPag
ce90: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74  er->tempFile = t
cea0: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
ceb0: 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
cec0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
ced0: 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
cee0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
cef0: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
cf00: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
cf10: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
cf20: 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
cf30: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
cf40: 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
cf50: 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72  c?0:1);.  pPager
cf60: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
cf70: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
cf80: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
cf90: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
cfa0: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
cfb0: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  = nExtra;.  pPag
cfc0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
cfd0: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
cfe0: 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  ZE;.  pPager->pB
cff0: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 28 42 75  usyHandler = (Bu
d000: 73 79 48 61 6e 64 6c 65 72 20 2a 29 70 42 75 73  syHandler *)pBus
d010: 79 48 61 6e 64 6c 65 72 3b 0a 20 20 6d 65 6d 73  yHandler;.  mems
d020: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
d030: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
d040: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a  er->aHash));.  *
d050: 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
d060: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d070: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
d080: 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  et the destructo
d090: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
d0a0: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
d0b0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
d0c0: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e  s called.** when
d0d0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
d0e0: 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67  ount on each pag
d0f0: 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  e reaches zero. 
d100: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
d110: 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  can.** be used t
d120: 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72  o clean up infor
d130: 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78  mation in the ex
d140: 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65  tra segment appe
d150: 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67  nded to each pag
d160: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73  e..**.** The des
d170: 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63  tructor is not c
d180: 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c  alled as a resul
d190: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
d1a0: 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
d1b0: 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
d1c0: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
d1d0: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
d1e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d1f0: 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72  3pager_set_destr
d200: 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
d210: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
d220: 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  c)(void*,int)){.
d230: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
d240: 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
d250: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
d260: 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  reinitializer fo
d270: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
d280: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
d290: 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
d2a0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
d2b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
d2c0: 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
d2d0: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
d2e0: 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61  s original.** va
d2f0: 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  lue as a result 
d300: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  of a rollback.  
d310: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76  The callback giv
d320: 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  es higher-level 
d330: 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72  code.** an oppor
d340: 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72  tunity to restor
d350: 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74  e the EXTRA sect
d360: 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74  ion to agree wit
d370: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a  h the restored.*
d380: 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  * page data..*/.
d390: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
d3a0: 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50  r_set_reiniter(P
d3b0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
d3c0: 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f  id (*xReinit)(vo
d3d0: 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  id*,int)){.  pPa
d3e0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
d3f0: 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a   xReinit;.}../*.
d400: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
d410: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
d420: 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ges in the disk 
d430: 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
d440: 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a  with.** pPager..
d450: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
d460: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61  ger_pagecount(Pa
d470: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d480: 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65 72  off_t n;.  asser
d490: 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
d4a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
d4b0: 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72  Size>=0 ){.    r
d4c0: 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64 62  eturn pPager->db
d4d0: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Size;.  }.  if( 
d4e0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
d4f0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  e(&pPager->fd, &
d500: 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  n)!=SQLITE_OK ){
d510: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
d520: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
d530: 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74 75  R_DISK;.    retu
d540: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d  rn 0;.  }.  n /=
d550: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
d560: 45 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  E;.  if( !pPager
d570: 2d 3e 6d 65 6d 44 62 20 26 26 20 6e 3d 3d 50 45  ->memDb && n==PE
d580: 4e 44 49 4e 47 5f 42 59 54 45 2f 53 51 4c 49 54  NDING_BYTE/SQLIT
d590: 45 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  E_PAGE_SIZE ){. 
d5a0: 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66     n++;.  }.  if
d5b0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
d5c0: 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
d5d0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
d5e0: 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  ize = n;.  }.  r
d5f0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
d600: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
d610: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
d620: 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
d630: 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  Pager*);.../*.**
d640: 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66   Unlink a page f
d650: 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
d660: 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61  t (the list of a
d670: 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  ll pages where n
d680: 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66  Ref==0).** and f
d690: 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c  rom its hash col
d6a0: 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f  lision chain..*/
d6b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
d6c0: 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  inkPage(PgHdr *p
d6d0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
d6e0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
d6f0: 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74  er;..  /* Keep t
d700: 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20  he pFirstSynced 
d710: 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67  pointer pointing
d720: 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79   at the first sy
d730: 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20  nchronized page 
d740: 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50  */.  if( pPg==pP
d750: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
d760: 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  ed ){.    PgHdr 
d770: 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
d780: 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ree;.    while( 
d790: 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
d7a0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
d7b0: 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67  Free; }.    pPag
d7c0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
d7d0: 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = p;.  }..  /* 
d7e0: 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
d7f0: 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66  freelist */.  if
d800: 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
d810: 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   ){.    pPg->pPr
d820: 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
d830: 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
d840: 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
d850: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
d860: 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a  >pFirst==pPg );.
d870: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
d880: 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
d890: 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ree;.  }.  if( p
d8a0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
d8b0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
d8c0: 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
d8d0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
d8e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
d8f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c  sert( pPager->pL
d900: 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  ast==pPg );.    
d910: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
d920: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
d930: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
d940: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
d950: 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  vFree = 0;..  /*
d960: 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
d970: 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65   pgno hash table
d980: 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70   */.  if( pPg->p
d990: 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
d9a0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
d9b0: 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
d9c0: 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a  >pPrevHash;.  }.
d9d0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
d9e0: 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d  Hash ){.    pPg-
d9f0: 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
da00: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
da10: 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
da20: 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67  .    int h = pag
da30: 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e  er_hash(pPg->pgn
da40: 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
da50: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
da60: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
da70: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
da80: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
da90: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
daa0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
dab0: 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  vHash = 0;.}../*
dac0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
dad0: 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e   is used to trun
dae0: 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  cate an in-memor
daf0: 79 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c  y database.  Del
db00: 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73  ete.** all pages
db10: 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c   whose pgno is l
db20: 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
db30: 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73  r->dbSize and is
db40: 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a   unreferenced..*
db50: 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67  * Referenced pag
db60: 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  es larger than p
db70: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72  Pager->dbSize ar
db80: 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61  e zeroed..*/.sta
db90: 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54  tic void memoryT
dba0: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
dbb0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
dbc0: 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a  *pPg;.  PgHdr **
dbd0: 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69  ppPg;.  int dbSi
dbe0: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
dbf0: 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26  ize;..  ppPg = &
dc00: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
dc10: 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70  while( (pPg = *p
dc20: 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  pPg)!=0 ){.    i
dc30: 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62  f( pPg->pgno<=db
dc40: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70  Size ){.      pp
dc50: 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
dc60: 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  All;.    }else i
dc70: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  f( pPg->nRef>0 )
dc80: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
dc90: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
dca0: 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
dcb0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
dcc0: 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
dcd0: 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tAll;.    }else{
dce0: 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70  .      *ppPg = p
dcf0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
dd00: 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70      unlinkPage(p
dd10: 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Pg);.      sqlit
dd20: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  eFree(pPg);.    
dd30: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d    pPager->nPage-
dd40: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  -;.    }.  }.}..
dd50: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
dd60: 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e  he file to the n
dd70: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
dd80: 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74  pecified..*/.int
dd90: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72   sqlite3pager_tr
dda0: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
ddb0: 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
ddc0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
ddd0: 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
dde0: 65 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e<0 ){.    sqlit
ddf0: 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
de00: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
de10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
de20: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
de30: 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
de40: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
de50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
de60: 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69  if( nPage>=(unsi
de70: 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
de80: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
de90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
dea0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d  .  if( pPager->m
deb0: 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
dec0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
ded0: 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72  ge;.    memoryTr
dee0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
def0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
df00: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
df10: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
df20: 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
df30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
df40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
df50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
df60: 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72  Truncate(&pPager
df70: 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47  ->fd, SQLITE_PAG
df80: 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6e 50  E_SIZE*(off_t)nP
df90: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
dfa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dfb0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
dfc0: 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72  = nPage;.  }.  r
dfd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
dfe0: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
dff0: 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
e000: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
e010: 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
e020: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
e030: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
e040: 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
e050: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e060: 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
e070: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
e080: 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
e090: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
e0a0: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
e0b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
e0c0: 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
e0d0: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
e0e0: 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
e0f0: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
e100: 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
e110: 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
e120: 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
e130: 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
e140: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
e150: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
e160: 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  r_close(Pager *p
e170: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
e180: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
e190: 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e  switch( pPager->
e1a0: 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  state ){.    cas
e1b0: 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
e1c0: 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  :.    case PAGER
e1d0: 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63 61  _SYNCED: .    ca
e1e0: 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  se PAGER_EXCLUSI
e1f0: 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  VE: {.      sqli
e200: 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
e210: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
e220: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
e230: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mDb ){.        s
e240: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
e250: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
e260: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
e270: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
e280: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
e290: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
e2a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e2b0: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20  e PAGER_SHARED: 
e2c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
e2d0: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
e2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
e2f0: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
e300: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
e310: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
e320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
e330: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
e340: 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
e350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e360: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70  .  }.  for(pPg=p
e370: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
e380: 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69  ; pPg=pNext){.#i
e390: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
e3a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
e3b0: 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69  Db ){.      PgHi
e3c0: 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
e3d0: 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
e3e0: 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
e3f0: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
e400: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
e410: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
e420: 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
e430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
e440: 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
e450: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
e460: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
e470: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
e480: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
e490: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
e4a0: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
e4b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
e4c0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
e4d0: 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
e4e0: 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
e4f0: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
e500: 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
e510: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
e520: 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
e530: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
e540: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
e550: 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43 4c 52   ** }.  */.  CLR
e560: 5f 50 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a  _PAGER(pPager);.
e570: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46    if( pPager->zF
e580: 69 6c 65 6e 61 6d 65 21 3d 28 63 68 61 72 2a 29  ilename!=(char*)
e590: 26 70 50 61 67 65 72 5b 31 5d 20 29 7b 0a 20 20  &pPager[1] ){.  
e5a0: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
e5b0: 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e  /* Cannot happen
e5c0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72   */.    sqliteFr
e5d0: 65 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ee(pPager->zFile
e5e0: 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  name);.    sqlit
e5f0: 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 4a  eFree(pPager->zJ
e600: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ournal);.    sql
e610: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
e620: 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d  zDirectory);.  }
e630: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
e640: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
e650: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e660: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
e670: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
e680: 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
e690: 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
e6a0: 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  te3pager_pagenum
e6b0: 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ber(void *pData)
e6c0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44  {.  PgHdr *p = D
e6d0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
e6e0: 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ta);.  return p-
e6f0: 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pgno;.}../*.** 
e700: 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
e710: 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
e720: 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
e730: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
e740: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
e750: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
e760: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
e770: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
e780: 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
e790: 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
e7a0: 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
e7b0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
e7c0: 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
e7d0: 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
e7e0: 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
e7f0: 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
e800: 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
e810: 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
e820: 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
e830: 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
e840: 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
e850: 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
e860: 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
e870: 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
e880: 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
e890: 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
e8a0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
e8b0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
e8c0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
e8d0: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
e8e0: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
e8f0: 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
e900: 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d     if( pPg==pPg-
e910: 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
e920: 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ynced ){.      P
e930: 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
e940: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
e950: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
e960: 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
e970: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
e980: 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
e990: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
e9a0: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   p;.    }.    if
e9b0: 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
e9c0: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
e9d0: 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
e9e0: 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
e9f0: 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
ea00: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
ea10: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
ea20: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
ea30: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
ea40: 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
ea50: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
ea60: 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
ea70: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
ea80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ea90: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61  pPg->pPager->pLa
eaa0: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
eab0: 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ree;.    }.    p
eac0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66  Pg->pPager->nRef
ead0: 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e  ++;.  }.  pPg->n
eae0: 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref++;.  REFINFO
eaf0: 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20  (pPg);.}.#ifdef 
eb00: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74  SQLITE_TEST.  st
eb10: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
eb20: 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
eb30: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
eb40: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70  f==0 ){.      _p
eb50: 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
eb60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
eb70: 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Pg->nRef++;.    
eb80: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
eb90: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
eba0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65  # define page_re
ebb0: 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65  f(P)   ((P)->nRe
ebc0: 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50  f==0?_page_ref(P
ebd0: 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65  ):(void)(P)->nRe
ebe0: 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  f++).#endif../*.
ebf0: 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
ec00: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
ec10: 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68   for a page.  Th
ec20: 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20  e input pointer 
ec30: 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  is.** a referenc
ec40: 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61  e to the page da
ec50: 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ta..*/.int sqlit
ec60: 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64  e3pager_ref(void
ec70: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
ec80: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
ec90: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
eca0: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
ecb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ecc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
ecd0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
ece0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
ecf0: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
ed00: 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
ed10: 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
ed20: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
ed30: 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
ed40: 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
ed50: 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
ed60: 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
ed70: 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
ed80: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
ed90: 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
eda0: 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
edb0: 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
edc0: 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
edd0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
ede0: 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
edf0: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
ee00: 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
ee10: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
ee20: 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
ee30: 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
ee40: 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
ee50: 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
ee60: 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
ee70: 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
ee80: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
ee90: 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
eea0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
eeb0: 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
eec0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
eed0: 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
eee0: 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
eef0: 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
ef00: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
ef10: 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
ef20: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
ef30: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
ef40: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
ef50: 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
ef60: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
ef70: 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
ef80: 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
ef90: 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
efa0: 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
efb0: 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
efc0: 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
efd0: 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
efe0: 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
eff0: 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
f000: 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
f010: 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
f020: 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
f030: 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
f040: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
f050: 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
f060: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f070: 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64   clears the need
f080: 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76  Sync field of ev
f090: 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74  ery page current
f0a0: 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f   held in.** memo
f0b0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
f0c0: 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
f0d0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
f0e0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
f0f0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f100: 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  ;..  /* Sync the
f110: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
f120: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61  modifying the ma
f130: 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  in database.  **
f140: 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65   (assuming there
f150: 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e   is a journal an
f160: 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  d it needs to be
f170: 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20   synced.).  */. 
f180: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
f190: 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28  dSync ){.    if(
f1a0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
f1b0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  le ){.      asse
f1c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f1d0: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
f1e0: 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61   /* assert( !pPa
f1f0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f  ger->noSync ); /
f200: 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62  / noSync might b
f210: 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f  e set if synchro
f220: 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61  nous.      ** wa
f230: 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74  s turned off aft
f240: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
f250: 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20  on was started. 
f260: 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a   Ticket #615 */.
f270: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
f280: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
f290: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
f2a0: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75  pPager->nRec cou
f2b0: 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70  nter we are keep
f2c0: 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20  ing agrees.     
f2d0: 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e     ** with the n
f2e0: 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
f2f0: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
f300: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
f310: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f320: 20 20 20 6f 66 66 5f 74 20 6a 53 7a 3b 0a 20 20     off_t jSz;.  
f330: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f340: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
f350: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29  ager->jfd, &jSz)
f360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f370: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
f380: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f390: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f3a0: 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20  Off==jSz );.    
f3b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
f3c0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72   {.        /* Wr
f3d0: 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
f3e0: 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
f3f0: 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
f400: 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
f410: 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
f420: 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
f430: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
f440: 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
f450: 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
f460: 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
f470: 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
f480: 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
f490: 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
f4a0: 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
f4b0: 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
f4c0: 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20  ollback. .      
f4d0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
f4e0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
f4f0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  c ){.          T
f500: 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
f510: 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  nal of %d\n", pP
f520: 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20  ager->fd.h);.   
f530: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f540: 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
f550: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
f560: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
f570: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
f580: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
f590: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
f5a0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
f5b0: 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
f5c0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f5d0: 63 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  c));.        rc 
f5e0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
f5f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
f600: 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
f610: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
f620: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20  rn rc;..        
f630: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
f640: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
f650: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
f660: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
f670: 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
f680: 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  nal of %d\n", pP
f690: 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20  ager->fd.h);.   
f6a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f6b0: 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a  sSync(&pPager->j
f6c0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
f6d0: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
f6e0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
f6f0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
f700: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
f710: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
f720: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
f730: 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
f740: 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
f750: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
f760: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
f770: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
f780: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
f790: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
f7a0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
f7b0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
f7c0: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
f7d0: 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69  >pFirst;.  }..#i
f7e0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
f7f0: 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
f800: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
f810: 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50  clear then the P
f820: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20  gHdr.needSync.  
f830: 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73  ** flag must als
f840: 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61  o be clear for a
f850: 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66  ll pages.  Verif
f860: 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
f870: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72   invariant is tr
f880: 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ue..  */.  else{
f890: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
f8a0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
f8b0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
f8c0: 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l){.      assert
f8d0: 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
f8e0: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
f8f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f900: 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
f910: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a  ager->pFirst );.
f920: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
f930: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f940: 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
f950: 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
f960: 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
f970: 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
f980: 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
f990: 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
f9a0: 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
f9b0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
f9c0: 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
f9d0: 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
f9e0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
f9f0: 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
fa00: 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
fa10: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
fa20: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 75 73  nt rc;.  int bus
fa30: 79 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 70 4c  y = 1;..  if( pL
fa40: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
fa50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
fa60: 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
fa70: 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
fa80: 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
fa90: 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
faa0: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
fab0: 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
fac0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
fad0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
fae0: 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
faf0: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
fb00: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
fb10: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
fb20: 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
fb30: 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
fb40: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
fb50: 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
fb60: 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
fb70: 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
fb80: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
fb90: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
fba0: 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
fbb0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
fbc0: 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
fbd0: 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
fbe0: 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
fbf0: 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
fc00: 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
fc10: 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
fc20: 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
fc30: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
fc40: 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
fc50: 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
fc60: 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
fc70: 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
fc80: 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
fc90: 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
fca0: 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
fcb0: 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
fcc0: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
fcd0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
fce0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
fcf0: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
fd00: 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
fd10: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
fd20: 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
fd30: 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
fd40: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
fd50: 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
fd60: 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
fd70: 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
fd80: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
fd90: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
fda0: 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
fdb0: 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
fdc0: 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
fdd0: 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
fde0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a  ck..  */.  do {.
fdf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fe00: 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
fe10: 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
fe20: 43 4b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  CK);.  }while( r
fe30: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
fe40: 26 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  & .      pPager-
fe50: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26  >pBusyHandler &&
fe60: 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
fe70: 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46  pBusyHandler->xF
fe80: 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20 70 50  unc && .      pP
fe90: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
fea0: 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65 72  er->xFunc(pPager
feb0: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
fec0: 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20  pArg, busy++).  
fed0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
fee0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
fef0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
ff00: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
ff10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
ff20: 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
ff30: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ff40: 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20  List->dirty );. 
ff50: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
ff60: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
ff70: 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f  List->pgno-1)*(o
ff80: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
ff90: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45  _SIZE);.    CODE
ffa0: 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
ffb0: 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
ffc0: 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
ffd0: 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4f  .    TRACE2("STO
ffe0: 52 45 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  RE page %d\n", p
fff0: 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
10000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
10010 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  rite(&pPager->fd
10020 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
10030 70 4c 69 73 74 29 2c 20 53 51 4c 49 54 45 5f 50  pList), SQLITE_P
10040 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43  AGE_SIZE);.    C
10050 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
10060 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
10070 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
10080 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
10090 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
100a0 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30  pList->dirty = 0
100b0 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
100c0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
100d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
100e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
100f0 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
10100 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
10110 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
10120 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
10130 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
10140 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
10150 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
10160 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
10170 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
10180 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
10190 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
101a0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
101b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
101c0 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c  .  PgHdr *p, *pL
101d0 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30  ist;.  pList = 0
101e0 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
101f0 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
10200 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
10210 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  f( p->dirty ){. 
10220 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d       p->pDirty =
10230 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c   pList;.      pL
10240 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ist = p;.    }. 
10250 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
10260 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  t;.}../*.** Acqu
10270 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ire a page..**.*
10280 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  * A read lock on
10290 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
102a0 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20  s obtained when 
102b0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
102c0 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20  s acquired. .** 
102d0 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69  This read lock i
102e0 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74  s dropped when t
102f0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  he last page is 
10300 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
10310 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72  A _get works for
10320 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
10330 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
10340 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
10350 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
10360 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
10370 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
10380 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
10390 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
103a0 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
103b0 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
103c0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
103d0 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
103e0 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
103f0 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
10400 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
10410 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
10420 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
10430 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
10440 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
10450 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
10460 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
10470 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
10480 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
10490 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
104a0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
104b0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
104c0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
104d0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
104e0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
104f0 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
10500 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
10510 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b  outine and _look
10520 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
10530 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
10540 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
10550 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
10560 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
10570 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
10580 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
10590 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
105a0 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
105b0 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29  hereas _lookup()
105c0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
105d0 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
105e0 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
105f0 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
10600 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
10610 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
10620 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
10630 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
10640 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
10650 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f  ry..** Since _lo
10660 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
10670 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
10680 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
10690 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
106a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
106b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
106c0 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70  ger_get(Pager *p
106d0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
106e0 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29  , void **ppPage)
106f0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
10700 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
10710 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
10720 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
10730 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
10740 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
10750 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
10760 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
10770 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
10780 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
10790 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f  rMask & ~(PAGER_
107a0 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20  ERR_FULL) ){.   
107b0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
107c0 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
107d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
107e0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
107f0 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
10800 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
10810 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
10820 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
10830 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
10840 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 70 50  ->nRef==0 && !pP
10850 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
10860 20 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b     int busy = 1;
10870 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
10880 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
10890 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
108a0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
108b0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
108c0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20  LITE_BUSY && .  
108d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
108e0 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a 20  usyHandler && . 
108f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
10900 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75  BusyHandler->xFu
10910 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  nc && .        p
10920 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
10930 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65  ler->xFunc(pPage
10940 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
10950 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20  >pArg, busy++). 
10960 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
10970 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10980 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10990 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
109a0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
109b0 53 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20  SHARED;..    /* 
109c0 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
109d0 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
109e0 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
109f0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
10a00 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
10a10 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
10a20 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
10a30 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
10a40 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
10a50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
10a60 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 0a 20 20  seJournal && .  
10a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
10a80 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72  ileExists(pPager
10a90 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 26 26 0a 20  ->zJournal) &&. 
10aa0 20 20 20 20 20 20 20 21 73 71 6c 69 74 65 33 4f         !sqlite3O
10ab0 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
10ac0 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 20  ck(&pPager->fd) 
10ad0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 69  .    ){.       i
10ae0 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f  nt rc;..       /
10af0 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
10b00 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
10b10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
10b20 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
10b30 73 0a 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  s.       ** impo
10b40 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
10b50 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
10b60 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
10b70 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
10b80 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
10b90 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
10ba0 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
10bb0 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
10bc0 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  e.       ** data
10bd0 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
10be0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
10bf0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
10c00 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
10c10 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
10c20 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
10c30 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
10c40 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
10c50 67 20 69 74 20 0a 20 20 20 20 20 20 20 2a 2a 20  g it .       ** 
10c60 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20  back..       ** 
10c70 0a 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75  .       ** Becau
10c80 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
10c90 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
10ca0 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
10cb0 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20 2a  ed, the.       *
10cc0 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73  * second process
10cd0 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69   will get to thi
10ce0 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
10cf0 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a  ode and fail to.
10d00 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e         ** obtain
10d10 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53   it's own EXCLUS
10d20 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
10d30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
10d40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
10d50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
10d60 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
10d70 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
10d80 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
10d90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
10db0 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
10dc0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
10dd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
10de0 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
10df0 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  CK;.         ret
10e00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d  urn rc;.       }
10e10 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
10e20 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
10e30 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20  CLUSIVE;..      
10e40 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
10e50 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67  rnal for reading
10e60 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53   only.  Return S
10e70 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20  QLITE_BUSY if.  
10e80 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
10e90 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
10ea0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
10eb0 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  .       **.     
10ec0 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    ** The journal
10ed0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e   file does not n
10ee0 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
10ef0 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20   itself.  The.  
10f00 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
10f10 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
10f20 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
10f30 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
10f40 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a   holds.       **
10f50 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
10f60 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
10f70 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
10f80 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
10f90 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f    ** processes o
10fa0 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
10fb0 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  al at the same t
10fc0 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ime..       */. 
10fd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10fe0 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
10ff0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
11000 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  l, &pPager->jfd)
11010 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
11020 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
11040 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
11050 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
11060 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
11070 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
11080 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65  OCK;.         re
11090 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
110a0 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
110b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
110c0 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
110d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
110e0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
110f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
11100 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
11110 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
11120 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
11130 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11140 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20  lHdr = 0;..     
11150 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
11160 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
11170 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
11180 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
11190 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
111a0 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
111b0 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
111c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
111d0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
111e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
111f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11200 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65  K ){.         re
11210 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
11220 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
11230 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
11240 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
11250 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f  page in cache */
11260 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
11270 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
11280 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70  pgno);.    if( p
11290 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20  Pager->memDb && 
112a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
112b0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
112c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
112d0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
112e0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  D;.    }.  }.  i
112f0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
11300 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
11310 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
11320 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
11330 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20   */.    int h;. 
11340 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73     pPager->nMiss
11350 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
11360 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72  er->nPage<pPager
11370 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67  ->mxPage || pPag
11380 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c  er->pFirst==0 ||
11390 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
113a0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  {.      /* Creat
113b0 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a  e a new page */.
113c0 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
113d0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
113e0 65 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49  eof(*pPg) + SQLI
113f0 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  TE_PAGE_SIZE .  
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
11420 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67  zeof(u32) + pPag
11430 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20  er->nExtra.     
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11450 20 20 20 20 20 20 20 20 20 2b 20 70 50 61 67 65           + pPage
11460 72 2d 3e 6d 65 6d 44 62 2a 73 69 7a 65 6f 66 28  r->memDb*sizeof(
11470 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20  PgHistory) );.  
11480 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
11490 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
114a0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
114b0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
114c0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
114d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
114e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
114f0 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
11500 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  ERR_MEM;.       
11510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11520 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
11530 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20      memset(pPg, 
11540 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29  0, sizeof(*pPg))
11550 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
11560 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
11570 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
11580 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
11590 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
115a0 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
115b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
115c0 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
115d0 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  r;.      pPg->pN
115e0 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
115f0 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61  >pAll;.      pPa
11600 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
11610 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
11620 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  Page++;.    }els
11630 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  e{.      /* Find
11640 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
11650 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61  le.  Try to loca
11660 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64  te a page that d
11670 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  oes not.      **
11680 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64   require us to d
11690 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20  o an fsync() on 
116a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  the journal..   
116b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20     */.      pPg 
116c0 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
116d0 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f  Synced;..      /
116e0 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f  * If we could no
116f0 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68  t find a page th
11700 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
11710 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20  ire an fsync(). 
11720 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a       ** on the j
11730 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
11740 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e   fsync the journ
11750 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  al file.  This i
11760 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65 72  s a.      ** ver
11770 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
11780 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
11790 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
117a0 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
117b0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20      ** it can't 
117c0 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20 20  be helped..     
117d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
117e0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
117f0 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
11800 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
11810 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
11820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11830 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
11840 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
11850 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11860 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
11870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
11880 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
11890 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
118a0 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
118b0 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20  c mode, write a 
118c0 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  new journal head
118d0 65 72 20 69 6e 74 6f 20 74 68 65 0a 09 20 20 2a  er into the..  *
118e0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
118f0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
11900 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
11910 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 09  ying a journal..
11920 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74    ** header that
11930 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
11940 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  the rollback of 
11950 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
11960 09 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  .  ** already be
11970 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
11980 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63  e database (in c
11990 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69  ase the header i
119a0 73 0a 09 20 20 2a 2a 20 74 72 61 73 68 65 64 20  s..  ** trashed 
119b0 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  when the nRec fi
119c0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e  eld is updated).
119d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
119e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
119f0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
11a00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
11a10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e  er->journalOff >
11a20 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0 );.          
11a30 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
11a40 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
11a50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
11a60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
11a70 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
11a80 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
11a90 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
11aa0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
11ab0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
11ad0 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
11ae0 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rst;.      }.   
11af0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
11b00 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  nRef==0 );..    
11b10 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
11b20 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
11b30 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69  ase file if it i
11b40 73 20 64 69 72 74 79 2e 0a 20 20 20 20 20 20 2a  s dirty..      *
11b50 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  /.      if( pPg-
11b60 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
11b70 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
11b80 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
11b90 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74        pPg->pDirt
11ba0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  y = 0;.        r
11bb0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
11bc0 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b  pagelist( pPg );
11bd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
11be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
11c00 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
11c10 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
11c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
11c30 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
11c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
11c50 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
11c60 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==0 );..      /*
11c70 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20   If the page we 
11c80 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73  are recycling is
11c90 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
11ca0 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a  sRollback, then.
11cb0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
11cc0 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f   global alwaysRo
11cd0 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75  llback flag, thu
11ce0 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a  s disabling the.
11cf0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f        ** sqlite_
11d00 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
11d10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
11d20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
11d30 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
11d40 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65       ** It is ne
11d50 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68  cessary to do th
11d60 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70  is because the p
11d70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  age marked alway
11d80 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20  sRollback.      
11d90 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f  ** might be relo
11da0 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20  aded at a later 
11db0 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74  time but at that
11dc0 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20   point we won't 
11dd0 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a  remember.      *
11de0 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61  * that is was ma
11df0 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
11e00 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  ack.  This means
11e10 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
11e20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  must.      ** be
11e30 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
11e40 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
11e50 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20  ere on out..    
11e60 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
11e70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
11e80 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ck ){.        pP
11e90 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
11ea0 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  back = 1;.      
11eb0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69  }..      /* Unli
11ec0 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
11ed0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
11ee0 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
11ef0 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20  table.      */. 
11f00 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28       unlinkPage(
11f10 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
11f20 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20  er->nOvfl++;.   
11f30 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f   }.    pPg->pgno
11f40 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28   = pgno;.    if(
11f50 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
11f60 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
11f70 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
11f80 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
11f90 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79  lite3CheckMemory
11fa0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
11fb0 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20  nal, pgno/8);.  
11fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
11fd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11fe0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
11ff0 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65  Journal = (pPage
12000 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
12010 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
12020 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20  o&7)))!=0;.     
12030 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
12040 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
12050 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
12060 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
12070 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
12080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12090 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
120a0 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
120b0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20  ager->stmtSize. 
120c0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
120d0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
120e0 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
120f0 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20  gno&7)))!=0 ){. 
12100 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
12110 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
12120 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12130 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72    page_remove_fr
12140 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  om_stmt_list(pPg
12150 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  );.    }.    pPg
12160 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
12170 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
12180 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
12190 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
121a0 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61  ef++;.    h = pa
121b0 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a  ger_hash(pgno);.
121c0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
121d0 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
121e0 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
121f0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
12200 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
12210 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
12220 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
12230 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
12240 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
12250 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
12260 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
12270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12280 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30  pPager->nExtra>0
12290 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
122a0 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
122b0 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
122c0 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a  >nExtra);.    }.
122d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
122e0 64 62 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74  dbSize<0 ) sqlit
122f0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
12300 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
12310 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
12320 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  sk!=0 ){.      s
12330 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
12340 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  f(PGHDR_TO_DATA(
12350 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20  pPg));.      rc 
12360 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
12370 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
12380 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12390 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
123a0 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f  dbSize<(int)pgno
123b0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
123c0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
123d0 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50  Pg), 0, SQLITE_P
123e0 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
123f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
12400 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
12410 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
12420 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
12430 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
12440 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
12450 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41  (off_t)SQLITE_PA
12460 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
12470 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
12480 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
12490 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
124a0 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g), SQLITE_PAGE_
124b0 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 54 52 41  SIZE);.      TRA
124c0 43 45 32 28 22 46 45 54 43 48 20 70 61 67 65 20  CE2("FETCH page 
124d0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
124e0 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  );.      CODEC(p
124f0 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
12500 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
12510 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20  pgno, 3);.      
12520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12530 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66  K ){.        off
12540 5f 74 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20  _t fileSize;.   
12550 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12560 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
12570 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65  er->fd,&fileSize
12580 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )!=SQLITE_OK.   
12590 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66              || f
125a0 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 53 51  ileSize>=pgno*SQ
125b0 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 29  LITE_PAGE_SIZE )
125c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
125d0 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50  te3pager_unref(P
125e0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
125f0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
12600 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
12610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12620 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
12630 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
12640 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
12650 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12660 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
12670 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
12680 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
12690 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
126a0 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  he. */.    pPage
126b0 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70  r->nHit++;.    p
126c0 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
126d0 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47  }.  *ppPage = PG
126e0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
126f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12700 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
12710 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
12720 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
12730 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
12740 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
12750 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
12760 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
12770 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
12780 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
12790 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
127a0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
127b0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
127c0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
127d0 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
127e0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
127f0 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
12800 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
12810 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
12820 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
12830 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
12840 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
12850 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
12860 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
12870 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
12880 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
12890 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
128a0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
128b0 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
128c0 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
128d0 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  appened..*/.void
128e0 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c   *sqlite3pager_l
128f0 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
12900 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
12910 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
12920 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12930 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12940 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66   pgno!=0 );.  if
12950 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
12960 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f  k & ~(PAGER_ERR_
12970 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74  FULL) ){.    ret
12980 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67  urn 0;.  }.  pPg
12990 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
129a0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
129b0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65   if( pPg==0 ) re
129c0 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72  turn 0;.  page_r
129d0 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
129e0 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
129f0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
12a00 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
12a10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
12a20 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
12a30 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
12a40 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
12a50 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
12a60 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
12a70 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
12a80 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
12a90 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
12aa0 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
12ab0 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
12ac0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
12ad0 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
12ae0 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
12af0 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
12b00 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
12b10 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
12b20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
12b30 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
12b40 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20   for this page. 
12b50 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41   */.  pPg = DATA
12b60 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
12b70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
12b80 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67  >nRef>0 );.  pPg
12b90 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49  ->nRef--;.  REFI
12ba0 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  NFO(pPg);..  /* 
12bb0 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
12bc0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
12bd0 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
12be0 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
12bf0 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
12c00 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
12c10 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
12c20 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
12c30 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
12c40 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
12c50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
12c60 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
12c70 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
12c80 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
12c90 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
12ca0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
12cb0 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
12cc0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
12cd0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
12ce0 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
12cf0 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
12d00 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
12d10 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
12d20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12d30 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
12d40 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
12d50 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20  tSynced==0 ){.  
12d60 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
12d70 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a  stSynced = pPg;.
12d80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
12d90 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
12da0 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
12db0 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
12dc0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
12dd0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
12de0 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c   .    /* When al
12df0 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68  l pages reach th
12e00 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70  e freelist, drop
12e10 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66   the read lock f
12e20 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  rom.    ** the d
12e30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
12e40 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
12e50 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73  >nRef--;.    ass
12e60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
12e70 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  f>=0 );.    if( 
12e80 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
12e90 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  && !pPager->memD
12ea0 62 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  b ){.      pager
12eb0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
12ec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12ee0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
12ef0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
12f00 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
12f10 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
12f20 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
12f30 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
12f40 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
12f50 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
12f60 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12f70 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
12f80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
12f90 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
12fa0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
12fb0 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
12fc0 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
12fd0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
12fe0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
12ff0 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
13000 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
13010 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
13020 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
13030 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 61  er->memDb );.  a
13040 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
13050 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
13060 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
13070 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13080 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  lOpen==0 );.  as
13090 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
130a0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71  eJournal );.  sq
130b0 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
130c0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
130d0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
130e0 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  al = sqliteMallo
130f0 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
13100 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
13110 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
13120 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nal==0 ){.    sq
13130 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
13140 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
13150 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
13160 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
13170 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
13180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13190 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  EM;.  }.  rc = s
131a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
131b0 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a  usive(pPager->zJ
131c0 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
131d0 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d  >jfd,pPager->tem
131e0 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72  pFile);.  pPager
131f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13200 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
13210 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
13220 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
13230 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
13240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13250 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
13260 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
13270 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
13280 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
13290 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
132a0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  &pPager->fd, SHA
132b0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
132c0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
132d0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
132e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
132f0 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44    sqlite3OsOpenD
13300 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d  irectory(pPager-
13310 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 26 70 50  >zDirectory, &pP
13320 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50  ager->jfd);.  pP
13330 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
13340 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
13350 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
13360 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
13370 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
13380 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
13390 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
133a0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
133b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
133c0 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
133d0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
133e0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
133f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
13400 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
13410 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
13420 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  ize;..  rc = wri
13430 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
13440 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  ger);..  if( pPa
13450 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
13460 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
13470 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
13480 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
13490 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  _begin(pPager);.
134a0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
134b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
134c0 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
134d0 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
134e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
134f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
13500 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
13510 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13520 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  rn rc;  .}../*.*
13530 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74  * Acquire a writ
13540 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e-lock on the da
13550 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63  tabase.  The loc
13560 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65  k is removed whe
13570 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20  n.** the any of 
13580 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61  the following ha
13590 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ppen:.**.**   * 
135a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
135b0 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64  mmit() is called
135c0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
135d0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
135e0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
135f0 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
13600 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  r_close() is cal
13610 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
13620 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
13630 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
13640 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
13650 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
13660 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
13670 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
13680 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
13690 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
136a0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
136b0 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
136c0 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
136d0 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
136e0 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74  is used merely t
136f0 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70  o.** acquire a p
13700 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
13710 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
13720 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
13730 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65  there is.** alre
13740 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
13750 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
13760 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
13770 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  d parameter indi
13780 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73  cates how much s
13790 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f  pace in bytes to
137a0 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a   reserve for a.*
137b0 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
137c0 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68   file-name at th
137d0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
137e0 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69  ournal when it i
137f0 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
13800 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   A journal file 
13810 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69  is opened if thi
13820 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
13830 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20  rary file.  For 
13840 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
13850 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  es, the opening 
13860 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13870 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
13880 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
13890 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64  n.** actual need
138a0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
138b0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
138c0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
138d0 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72  is already reser
138e0 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  ved for writing,
138f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13900 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
13910 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65   sqlite3pager_be
13920 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 29  gin(void *pData)
13930 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
13940 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
13950 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
13960 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
13970 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
13980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
13990 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
139a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
139b0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
139c0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
139d0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
139e0 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
139f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13a00 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
13a10 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  l==0 );.    if( 
13a20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
13a30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
13a40 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
13a50 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50  LUSIVE;.      pP
13a60 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
13a70 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
13a80 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
13a90 20 20 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31      int busy = 1
13aa0 3b 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  ;.      do {.   
13ab0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13ac0 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  3OsLock(&pPager-
13ad0 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
13ae0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  CK);.      }whil
13af0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
13b00 53 59 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  SY && .         
13b10 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
13b20 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20  ndler && .      
13b30 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
13b40 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20  yHandler->xFunc 
13b50 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 50  && .          pP
13b60 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
13b70 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65 72  er->xFunc(pPager
13b80 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
13b90 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20  pArg, busy++).  
13ba0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
13bb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13bc0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
13bd0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
13be0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
13bf0 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
13c00 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
13c10 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
13c20 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54  .      TRACE2("T
13c30 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
13c40 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
13c50 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
13c60 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
13c70 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
13c80 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
13c90 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
13ca0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
13cb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13cc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13cd0 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
13ce0 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
13cf0 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
13d00 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
13d10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
13d20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
13d30 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
13d40 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
13d50 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
13d60 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
13d70 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
13d80 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
13d90 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
13da0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
13db0 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
13dc0 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
13dd0 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
13de0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
13df0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
13e00 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
13e10 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
13e20 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
13e30 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
13e40 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
13e50 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
13e60 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
13e70 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
13e80 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
13e90 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
13ea0 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
13eb0 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
13ec0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
13ed0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
13ee0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
13ef0 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
13f00 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
13f10 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
13f20 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
13f30 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
13f40 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
13f50 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
13f60 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
13f70 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
13f80 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
13f90 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
13fa0 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
13fb0 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
13fc0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
13fd0 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
13fe0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
13ff0 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
14000 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
14010 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70  er_write(void *p
14020 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
14030 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
14040 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
14050 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
14060 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
14070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14080 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
14090 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
140a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
140b0 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  sk ){ .    retur
140c0 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
140d0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
140e0 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
140f0 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
14100 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
14110 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70   }..  assert( !p
14120 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
14130 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74   );..  /* Mark t
14140 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
14150 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
14160 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
14170 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
14180 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
14190 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
141a0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
141b0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
141c0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
141d0 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
141e0 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72  inStmt || pPager
141f0 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20  ->stmtInUse==0) 
14200 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
14210 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
14220 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14230 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
14240 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
14250 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
14260 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
14270 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74 74  to be.  ** writt
14280 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
14290 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
142a0 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
142b0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20  journal.  ** or 
142c0 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
142d0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
142e0 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
142f0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
14300 65 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20  exists and.  ** 
14310 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  create it if it 
14320 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  does not..  */. 
14330 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14340 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
14350 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73  LOCK );.  rc = s
14360 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
14370 6e 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20  n(pData);.  if( 
14380 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14390 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
143a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
143b0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
143c0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
143d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
143e0 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
143f0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
14400 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
14410 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
14420 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
14430 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14440 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
14450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14460 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
14470 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  !pPager->useJour
14480 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  nal );.  pPager-
14490 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
144a0 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  ..  /* The trans
144b0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
144c0 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
144d0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
144e0 20 6f 72 20 61 6e 0a 20 20 2a 2a 20 45 58 43 4c   or an.  ** EXCL
144f0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
14500 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
14510 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
14520 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
14530 0a 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  .  ** the transa
14540 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
14550 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
14560 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a 2f 0a 20   already..  */. 
14570 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
14580 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
14590 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70  >useJournal || p
145a0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 29 20 29 7b  Pager->memDb) ){
145b0 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50  .    if( (int)pP
145c0 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
145d0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
145e0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b  .      int szPg;
145f0 0a 20 20 20 20 20 20 75 33 32 20 73 61 76 65 64  .      u32 saved
14600 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
14610 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
14620 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
14630 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
14640 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
14650 72 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  r);.        TRAC
14660 45 32 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67 65  E2("JOURNAL page
14670 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
14680 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  o);.        asse
14690 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
146a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
146b0 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
146c0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
146d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
146e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
146f0 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
14700 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
14710 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47  pHist->pOrig, PG
14720 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
14730 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
14740 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
14750 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f         pPg->inJo
14760 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20  urnal = 1;.     
14770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14780 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 61 67 65  u32 cksum = page
14790 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
147a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61  pPg->pgno, pData
147b0 29 3b 0a 20 20 20 20 20 20 20 20 73 61 76 65 64  );.        saved
147c0 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f   = *(u32*)PGHDR_
147d0 54 4f 5f 45 58 54 52 41 28 70 50 67 29 3b 0a 20  TO_EXTRA(pPg);. 
147e0 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69         store32bi
147f0 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 53  ts(cksum, pPg, S
14800 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
14810 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d  ;.        szPg =
14820 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
14830 45 2b 38 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  E+8;.        sto
14840 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
14850 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
14860 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
14870 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
14880 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
14890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
148a0 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
148b0 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
148c0 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a  ta)[-4], szPg);.
148d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
148e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a  journalOff += sz
148f0 50 67 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  Pg;.        TRAC
14900 45 33 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67 65  E3("JOURNAL page
14910 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
14920 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  n", pPg->pgno, p
14930 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
14940 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61         CODEC(pPa
14950 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
14960 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20  >pgno, 0);.     
14970 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f     *(u32*)PGHDR_
14980 54 4f 5f 45 58 54 52 41 28 70 50 67 29 20 3d 20  TO_EXTRA(pPg) = 
14990 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69  saved;.        i
149a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
149b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
149c0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
149d0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
149e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
149f0 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
14a00 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
14a10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14a20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14a30 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
14a40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14a50 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
14a60 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
14a70 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
14a80 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
14a90 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
14aa0 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70  no&7);.        p
14ab0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
14ac0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
14ad0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a          pPg->inJ
14ae0 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
14af0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14b00 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
14b10 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
14b20 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
14b30 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
14b40 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
14b50 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
14b60 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
14b70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14b80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14b90 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
14ba0 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = !pPager->journ
14bb0 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
14bc0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
14bd0 20 20 20 20 54 52 41 43 45 33 28 22 41 50 50 45      TRACE3("APPE
14be0 4e 44 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  ND page %d needS
14bf0 79 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  ync=%d\n", pPg->
14c00 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
14c10 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ync);.    }.    
14c20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
14c30 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  c ){.      pPage
14c40 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
14c50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14c60 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
14c70 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
14c80 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
14c90 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a  s not in it,.  *
14ca0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
14cb0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
14cc0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
14cd0 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
14ce0 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  at.  ** the stat
14cf0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
14d00 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
14d10 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
14d20 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
14d30 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
14d40 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
14d50 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
14d60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
14d70 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
14d80 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
14d90 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
14da0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
14db0 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
14dc0 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
14dd0 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
14de0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
14df0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  bSize );.    if(
14e00 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
14e10 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
14e20 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
14e30 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
14e40 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
14e50 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
14e60 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 48  t==0 );.      pH
14e70 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c  ist->pStmt = sql
14e80 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
14e90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
14ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73  ;.      if( pHis
14eb0 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
14ec0 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
14ed0 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54  ->pStmt, PGHDR_T
14ee0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
14ef0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
14f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
14f10 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE2("STMT-JOURN
14f20 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  AL page %d\n", p
14f30 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  Pg->pgno);.    }
14f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72  else{.      stor
14f50 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e  e32bits(pPg->pgn
14f60 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20  o, pPg, -4);.   
14f70 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
14f80 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
14f90 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 72 63 20  o, 7);.      rc 
14fa0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
14fb0 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
14fc0 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34  ((char*)pData)-4
14fd0 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
14fe0 5a 45 2b 34 29 3b 0a 20 20 20 20 20 20 54 52 41  ZE+4);.      TRA
14ff0 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE2("STMT-JOURNA
15000 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  L page %d\n", pP
15010 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
15020 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
15030 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
15040 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
15050 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
15070 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
15080 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ger);.        pP
15090 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
150a0 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b   PAGER_ERR_FULL;
150b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
150c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
150d0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
150e0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ec++;.      asse
150f0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
15100 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
15110 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
15120 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
15130 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
15140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
15150 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
15160 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  t(pPg);.  }..  /
15170 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
15180 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
15190 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
151a0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
151b0 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  <(int)pPg->pgno 
151c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
151d0 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
151e0 6f 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  o;.    if( !pPag
151f0 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61  er->memDb && pPa
15200 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
15210 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
15220 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
15230 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
15240 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
15250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15260 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
15270 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
15280 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
15290 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
152a0 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
152b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
152c0 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
152d0 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
152e0 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
152f0 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
15300 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
15310 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
15320 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65  te3pager_iswrite
15330 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61  able(void *pData
15340 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
15350 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
15360 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
15370 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a   pPg->dirty;.}..
15380 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
15390 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
153a0 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
153b0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
153c0 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
153d0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
153e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76   sqlite3pager_ov
153f0 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
15400 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
15410 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
15420 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
15430 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
15440 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
15450 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
15460 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
15470 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15490 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
154a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
154b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
154c0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c     memcpy(pPage,
154d0 20 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50   pData, SQLITE_P
154e0 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
154f0 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
15500 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
15510 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
15530 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
15540 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
15550 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
15560 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
15570 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
15580 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70  ation on page "p
15590 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65  gno" back to the
155a0 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
155b0 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
155c0 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
155d0 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
155e0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
155f0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
15600 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
15610 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
15620 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
15630 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
15640 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
15650 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
15660 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
15670 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
15680 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
15690 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
156a0 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
156b0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
156c0 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
156d0 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  * sqlite3pager_d
156e0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62  ont_rollback() b
156f0 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
15700 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
15710 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
15720 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
15730 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
15740 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
15750 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
15760 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
15770 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
15780 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
15790 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
157a0 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
157b0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70  alls to sqlite3p
157c0 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
157d0 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
157e0 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
157f0 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
15800 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
15810 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
15820 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
15830 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
15840 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
15850 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
15860 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
15870 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
15880 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
15890 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
158a0 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
158b0 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
158c0 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
158d0 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
158e0 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
158f0 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
15900 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
15910 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
15920 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15930 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
15940 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e  used,.** the don
15950 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  t_rollback() rou
15960 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
15970 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
15980 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a   page contains.*
15990 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  * critical data,
159a0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
159b0 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
159c0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  s rolled back in
159d0 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65   spite.** of the
159e0 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
159f0 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   call..*/.void s
15a00 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
15a10 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  _write(Pager *pP
15a20 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
15a30 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
15a40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d  .  if( pPager->m
15a50 65 6d 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 0a  emDb ) return;..
15a60 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
15a70 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
15a80 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79  o);.  pPg->alway
15a90 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
15aa0 20 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d   if( pPg && pPg-
15ab0 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66  >dirty ){.    if
15ac0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
15ad0 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
15ae0 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
15af0 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
15b00 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
15b10 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
15b20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
15b30 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
15b40 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
15b50 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
15b60 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
15b70 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
15b80 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
15b90 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
15ba0 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
15bb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15bc0 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
15bd0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
15be0 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
15bf0 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
15c00 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
15c10 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
15c20 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
15c30 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
15c40 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
15c50 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
15c60 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
15c70 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
15c80 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
15c90 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
15ca0 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
15cb0 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
15cc0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
15cd0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
15ce0 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
15cf0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
15d00 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
15d10 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
15d20 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
15d30 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70  f %d\n", pgno, p
15d40 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
15d50 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
15d60 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
15d70 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
15d80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
15d90 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
15da0 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
15db0 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
15dc0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
15dd0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
15de0 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
15df0 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
15e00 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
15e10 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
15e20 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
15e30 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
15e40 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
15e50 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ournal..*/.void 
15e60 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
15e70 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20  t_rollback(void 
15e80 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
15e90 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
15ea0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
15eb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
15ec0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
15ed0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
15ee0 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e!=PAGER_EXCLUSI
15ef0 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  VE || pPager->jo
15f00 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72  urnalOpen==0 ) r
15f10 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
15f20 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
15f30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61   || pPager->alwa
15f40 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
15f50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65  ager->memDb ) re
15f60 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
15f70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
15f80 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
15f90 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
15fa0 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
15fb0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
15fc0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
15fd0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
15fe0 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
15ff0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
16000 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
16010 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
16020 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
16030 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
16040 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
16050 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
16060 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
16070 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  ;.      page_add
16080 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
16090 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  g);.    }.    TR
160a0 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
160b0 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
160c0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
160d0 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
160e0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
160f0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21  ->stmtInUse && !
16100 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28  pPg->inStmt && (
16110 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
16120 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
16130 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16140 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
16150 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
16160 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
16170 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
16180 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
16190 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  t!=0 );.    pPag
161a0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
161b0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
161c0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
161d0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
161e0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
161f0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  }.}.../*.** Clea
16200 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c  r a PgHistory bl
16210 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ock.*/.static vo
16220 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  id clearHistory(
16230 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
16240 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
16250 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20  pHist->pOrig);. 
16260 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
16270 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69  t->pStmt);.  pHi
16280 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20  st->pOrig = 0;. 
16290 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
162a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  0;.}../*.** Comm
162b0 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
162c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
162d0 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
162e0 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
162f0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
16300 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
16310 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
16320 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
16330 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
16340 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
16350 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
16360 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
16370 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
16380 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
16390 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61  3pager_commit(Pa
163a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
163b0 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
163c0 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
163d0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41  ger->errMask==PA
163e0 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
163f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16400 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
16410 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
16420 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16430 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16440 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
16450 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16460 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
16470 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
16480 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
16490 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
164a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
164b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
164c0 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
164d0 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
164e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
164f0 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f    }.  TRACE2("CO
16500 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67  MMIT %d\n", pPag
16510 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28  er->fd.h);.  if(
16520 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
16530 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
16540 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
16550 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
16560 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
16570 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
16580 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
16590 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
165a0 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
165b0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
165c0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
165d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
165e0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
165f0 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
16600 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
16610 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
16620 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
16630 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
16640 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
16650 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
16660 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
16670 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
16680 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
16690 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
166a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
166b0 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
166c0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
166d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
166e0 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
166f0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
16700 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
16710 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
16720 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
16730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
16740 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
16750 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
16760 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
16770 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  f( pPager->dirty
16780 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Cache==0 ){.    
16790 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77  /* Exit early (w
167a0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65  ithout doing the
167b0 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20   time-consuming 
167c0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
167d0 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66  calls).    ** if
167e0 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
167f0 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74   no changes to t
16800 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16810 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
16820 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
16830 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  c==0 );.    rc =
16840 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
16850 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
16860 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
16870 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
16880 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
16890 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
168a0 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20  lOpen );.  rc = 
168b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
168c0 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  c(pPager, 0);.  
168d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
168e0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f  K ){.    goto co
168f0 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a  mmit_abort;.  }.
16900 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
16910 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
16920 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
16930 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ze = -1;.  retur
16940 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  n rc;..  /* Jump
16950 20 68 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e   here if anythin
16960 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72  g goes wrong dur
16970 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
16980 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d  rocess..  */.com
16990 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20  mit_abort:.  rc 
169a0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  = sqlite3pager_r
169b0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
169c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
169d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
169e0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
169f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16a00 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
16a10 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
16a20 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
16a30 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
16a40 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
16a50 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
16a60 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
16a70 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
16a80 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
16a90 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
16aa0 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
16ab0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16ac0 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
16ad0 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
16ae0 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
16af0 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
16b00 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
16b10 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50  otocol (SQLITE_P
16b20 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65  ROTOCOL) or unle
16b30 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
16b40 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
16b50 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
16b60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16b70 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
16b80 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
16b90 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
16ba0 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
16bb0 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
16bc0 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
16bd0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
16be0 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
16bf0 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
16c00 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
16c10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
16c20 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
16c30 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  r_rollback(Pager
16c40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
16c50 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52   rc;.  TRACE2("R
16c60 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70  OLLBACK %d\n", p
16c70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
16c80 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
16c90 62 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  b ){.    PgHdr *
16ca0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
16cb0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
16cc0 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
16cd0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
16ce0 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Hist;.      asse
16cf0 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f  rt( !p->alwaysRo
16d00 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
16d10 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b  if( !p->dirty ){
16d20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16d30 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
16d40 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
16d50 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
16d60 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
16d70 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
16d80 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
16d90 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
16da0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
16db0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
16dc0 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
16dd0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
16de0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
16df0 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
16e00 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
16e10 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
16e20 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
16e30 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
16e40 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ize);.        TR
16e50 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 2d 50  ACE2("ROLLBACK-P
16e60 41 47 45 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67  AGE %d\n", p->pg
16e70 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  no);.      }else
16e80 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32  {.        TRACE2
16e90 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65  ("PAGE %d is cle
16ea0 61 6e 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b  an\n", p->pgno);
16eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
16ec0 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
16ed0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72  t);.      p->dir
16ee0 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ty = 0;.      p-
16ef0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
16f00 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20        p->inStmt 
16f10 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  = 0;.      p->pP
16f20 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65  revStmt = p->pNe
16f30 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20  xtStmt = 0;..   
16f40 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
16f50 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
16f60 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
16f70 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44  niter(PGHDR_TO_D
16f80 41 54 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e  ATA(p), pPager->
16f90 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16fa0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 0a   }.      .    }.
16fb0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
16fc0 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
16fd0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
16fe0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a  er->origDbSize;.
16ff0 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
17000 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
17010 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
17020 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
17030 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
17040 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
17050 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17060 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
17070 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
17080 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
17090 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
170a0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
170b0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
170c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
170d0 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  = -1;.    return
170e0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
170f0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
17100 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  =0 && pPager->er
17110 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52  rMask!=PAGER_ERR
17120 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
17130 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
17140 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
17150 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
17160 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
17170 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
17180 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
17190 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
171a0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
171b0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
171c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
171d0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
171e0 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
171f0 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  ger);.    rc2 = 
17200 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
17210 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
17220 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17230 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
17240 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
17250 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
17260 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
17270 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
17280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17290 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
172a0 4f 52 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67  ORRUPT;.    pPag
172b0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
172c0 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
172d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
172e0 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72  dbSize = -1;.  r
172f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17300 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
17310 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
17320 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
17330 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
17340 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
17350 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
17360 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
17370 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17380 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c  3pager_isreadonl
17390 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
173a0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
173b0 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
173c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
173d0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
173e0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
173f0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
17400 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73   *sqlite3pager_s
17410 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
17420 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
17430 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d  t a[9];.  a[0] =
17440 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
17450 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
17460 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
17470 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
17480 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
17490 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
174a0 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
174b0 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
174c0 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36  ->errMask;.  a[6
174d0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
174e0 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
174f0 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
17500 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c   = pPager->nOvfl
17510 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
17520 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
17530 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
17540 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
17550 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
17560 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
17570 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
17580 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
17590 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
175a0 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
175b0 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
175c0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
175d0 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
175e0 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
175f0 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
17600 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
17610 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
17620 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
17630 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72  stmt_begin(Pager
17640 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
17650 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d   rc;.  char zTem
17660 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
17670 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72  E_SIZE];.  asser
17680 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
17690 49 6e 55 73 65 20 29 3b 0a 20 20 54 52 41 43 45  InUse );.  TRACE
176a0 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64  2("STMT-BEGIN %d
176b0 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
176c0 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
176d0 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ->memDb ){.    p
176e0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
176f0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
17700 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
17710 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
17720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17730 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  K;.  }.  if( !pP
17740 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17750 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
17760 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
17770 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
17780 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
17790 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
177a0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
177b0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
177c0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
177d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
177e0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
177f0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30  ager->aInStmt==0
17800 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
17810 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  sLock(&pPager->f
17820 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
17830 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17840 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69  TE_NOMEM;.  }.#i
17850 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72  fndef NDEBUG.  r
17860 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
17870 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a  eSize(&pPager->j
17880 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d  fd, &pPager->stm
17890 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
178a0 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
178b0 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73  gin_failed;.  as
178c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
178d0 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65  mtJSize == pPage
178e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
178f0 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72  .#endif.  pPager
17900 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50  ->stmtJSize = pP
17910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
17920 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
17930 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
17940 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  bSize;.  pPager-
17950 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b  >stmtHdrOff = 0;
17960 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43  .  pPager->stmtC
17970 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
17980 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20  ksumInit;.  if( 
17990 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65  !pPager->stmtOpe
179a0 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
179b0 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
179c0 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67  emp(zTemp, &pPag
179d0 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69  er->stfd);.    i
179e0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
179f0 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
17a00 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
17a10 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
17a20 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
17a30 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
17a40 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
17a50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17a60 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
17a70 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
17a80 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
17a90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
17aa0 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  e(pPager->aInStm
17ab0 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
17ac0 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  aInStmt = 0;.  }
17ad0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17ae0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
17af0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
17b00 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
17b10 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  tmt_commit(Pager
17b20 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
17b30 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
17b40 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  se ){.    PgHdr 
17b50 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
17b60 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43    TRACE2("STMT-C
17b70 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50 61  OMMIT %d\n", pPa
17b80 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
17b90 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
17ba0 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Db ){.      sqli
17bb0 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
17bc0 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
17bd0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
17be0 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
17bf0 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >stfd, 0); */.  
17c00 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
17c10 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
17c20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
17c30 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
17c40 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d    }.    for(pPg=
17c50 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
17c60 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
17c70 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50        pNext = pP
17c80 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
17c90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
17ca0 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  >inStmt );.     
17cb0 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
17cc0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
17cd0 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  evStmt = pPg->pN
17ce0 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
17cf0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
17d00 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emDb ){.        
17d10 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
17d20 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
17d30 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
17d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
17d50 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
17d60 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
17d70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
17d80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
17d90 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
17da0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
17db0 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
17dc0 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
17dd0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
17de0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
17df0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
17e00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17e10 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
17e20 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
17e30 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
17e40 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
17e50 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
17e60 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
17e70 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
17e80 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
17e90 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
17ea0 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
17eb0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
17ec0 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67  emDb ){.      Pg
17ed0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
17ee0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
17ef0 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
17f00 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  pPg->pNextStmt){
17f10 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
17f20 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
17f30 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
17f40 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17f50 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
17f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
17f70 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
17f80 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
17f90 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
17fa0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
17fb0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
17fc0 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
17fd0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
17fe0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
17ff0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18000 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
18010 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
18020 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72  ize;.      memor
18030 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
18040 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
18050 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
18060 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
18070 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
18080 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
18090 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
180a0 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
180b0 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
180c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
180d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
180e0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
180f0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
18100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18110 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
18120 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
18130 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
18140 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
18150 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50  pager_filename(P
18160 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
18170 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18180 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
18190 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
181a0 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
181b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
181c0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
181d0 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e 61  lite3pager_dirna
181e0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
181f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
18200 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a  er->zDirectory;.
18210 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18220 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
18230 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
18240 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
18250 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
18260 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  er_journalname(P
18270 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
18280 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18290 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
182a0 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63  ** Set the codec
182b0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
182c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
182d0 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a  ager_set_codec(.
182e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
182f0 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
18300 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
18310 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  no,int),.  void 
18320 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20  *pCodecArg.){.  
18330 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
18340 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
18350 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70  r->pCodecArg = p
18360 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  CodecArg;.}../*.
18370 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18380 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
18390 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62  rement the datab
183a0 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
183b0 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72  counter,.** stor
183c0 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66  ed at byte 24 of
183d0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
183e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
183f0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
18400 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
18410 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a  Pager){.  void *
18420 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72 20 2a  pPage;.  PgHdr *
18430 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68  pPgHdr;.  u32 ch
18440 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20  ange_counter;.  
18450 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70  int rc;..  /* Op
18460 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
18470 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
18480 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  g. */.  rc = sql
18490 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
184a0 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 29  ager, 1, &pPage)
184b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
184c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
184d0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
184e0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
184f0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
18500 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
18510 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  n rc;..  /* Read
18520 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
18530 75 65 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a  ue at byte 24. *
18540 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44 41 54  /.  pPgHdr = DAT
18550 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61 67 65  A_TO_PGHDR(pPage
18560 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  );.  change_coun
18570 74 65 72 20 3d 20 72 65 74 72 69 65 76 65 33 32  ter = retrieve32
18580 62 69 74 73 28 70 50 67 48 64 72 2c 20 32 34 29  bits(pPgHdr, 24)
18590 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
185a0 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
185b0 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
185c0 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
185d0 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f  24. */.  change_
185e0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73 74 6f  counter++;.  sto
185f0 72 65 33 32 62 69 74 73 28 63 68 61 6e 67 65 5f  re32bits(change_
18600 63 6f 75 6e 74 65 72 2c 20 70 50 67 48 64 72 2c  counter, pPgHdr,
18610 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65   24);..  /* Rele
18620 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
18630 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c  erence. */.  sql
18640 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
18650 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
18660 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18670 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
18680 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
18690 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
186a0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
186b0 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
186c0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
186d0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
186e0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
186f0 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
18700 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
18710 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
18720 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
18730 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
18740 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
18750 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
18760 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
18770 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
18780 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
18790 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  es that the jour
187a0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61  nal is synced, a
187b0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77  ll dirty pages w
187c0 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65  ritten.** to the
187d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
187e0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
187f0 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65  file synced. The
18800 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
18810 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  .** remains to c
18820 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
18830 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65  ction is to dele
18840 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
18850 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65  ile (or.** maste
18860 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
18870 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
18880 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
18890 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
188a0 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
188b0 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
188c0 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
188d0 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
188e0 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63 61 6c  pager_sync() cal
188f0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
18900 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65  3pager_sync(Page
18910 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
18920 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
18930 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18940 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
18950 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
18960 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
18970 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
18980 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
18990 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
189a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
189b0 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
189c0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
189d0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
189e0 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
189f0 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  && !pPager->memD
18a00 62 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72  b && pPager->dir
18a10 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50  tyCache ){.    P
18a20 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61  gHdr *pPg;.    a
18a30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
18a40 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20  ournalOpen );.. 
18a50 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65     /* If a maste
18a60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
18a70 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
18a80 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
18a90 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
18aa0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  al file, then no
18ab0 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
18ac0 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  d. This happens 
18ad0 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a  when it is.    *
18ae0 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20  * written, then 
18af0 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c  the process fail
18b00 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  s to upgrade fro
18b10 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20  m a RESERVED to 
18b20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
18b30 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65  IVE lock. The ne
18b40 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63  xt time the proc
18b50 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d  ess tries to com
18b60 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  mit the.    ** t
18b70 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d  ransaction the m
18b80 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76  -j name will hav
18b90 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
18ba0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
18bb0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
18bc0 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  setMaster ){.   
18bd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
18be0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
18bf0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18c00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18c10 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
18c20 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  it;.      rc = w
18c30 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
18c40 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
18c50 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
18c60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18c70 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
18c80 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
18c90 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
18ca0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18cb0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
18cc0 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20  c_exit;.    }.. 
18cd0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
18ce0 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
18cf0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18d00 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
18d10 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
18d20 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
18d30 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
18d40 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
18d50 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
18d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
18d70 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20  o sync_exit;..  
18d80 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
18d90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
18da0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
18db0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
18dc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
18dd0 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ync(&pPager->fd)
18de0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
18df0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
18e00 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a  ER_SYNCED;.  }..
18e10 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74  sync_exit:.  ret
18e20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64  urn rc;.}..#if d
18e30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
18e40 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
18e50 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
18e60 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
18e70 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
18e80 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72  he file lock for
18e90 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
18ea0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
18eb0 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20  value is one of 
18ec0 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f  NO_LOCK, SHARED_
18ed0 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
18ee0 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  OCK,.** PENDING_
18ef0 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49  LOCK, or EXCLUSI
18f00 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20  VE_LOCK..*/.int 
18f10 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63  sqlite3pager_loc
18f20 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50  kstate(Pager *pP
18f30 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 4f 53  ager){.#ifdef OS
18f40 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e 20 70  _TEST.  return p
18f50 50 61 67 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f  Pager->fd->fd.lo
18f60 63 6b 74 79 70 65 3b 0a 23 65 6c 73 65 0a 20 20  cktype;.#else.  
18f70 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
18f80 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6e 64  d.locktype;.#end
18f90 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  if.}.#endif..#if
18fa0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18fb0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
18fc0 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
18fd0 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
18fe0 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
18ff0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
19000 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28  e3pager_refdump(
19010 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19020 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
19030 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
19040 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
19050 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
19060 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
19070 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
19080 20 20 20 20 70 72 69 6e 74 66 28 22 50 41 47 45      printf("PAGE
19090 20 25 33 64 20 61 64 64 72 3d 30 78 25 30 38 78   %3d addr=0x%08x
190a0 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
190b0 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
190c0 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41  (int)PGHDR_TO_DA
190d0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
190e0 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
190f0 66 0a                                            f.