/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 6240557abedaf6d888359a2365df45bce414c540:


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: 35 20 32 30 30 34 2f 30 36 2f 32 36 20 31 33 3a  5 2004/06/26 13:
0360: 35 31 3a 33 34 20 64 61 6e 69 65 6c 6b 31 39 37  51:34 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 69 6e 74 20 63 6b 73  t szJ;.  int cks
42f0: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
4300: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
4310: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
4320: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
4330: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
4340: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30  .  *pzMaster = 0
4350: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
4360: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
4370: 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  l, &szJ);.  if( 
4380: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
4390: 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e   szJ<16 ) return
43a0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
43b0: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
43c0: 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28  , szJ-16);.  if(
43d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
43e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20   return rc;. .  
43f0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
4400: 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20  pJrnl, &len);.  
4410: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4420: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
4430: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
4440: 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29  s(pJrnl, &cksum)
4450: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
4460: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
4470: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
4480: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
4490: 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66  aMagic, 8);.  if
44a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
44b0: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
44c0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
44d0: 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b   8) ) return rc;
44e0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
44f0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
4500: 4a 2d 31 32 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-12-len);.  if(
4510: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4520: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a   return rc;..  *
4530: 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72  pzMaster = (char
4540: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
4550: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a  len);.  if( !*pz
4560: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
4570: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
4580: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
4590: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
45a0: 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65  l, *pzMaster, le
45b0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
45c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
45d0: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
45e0: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
45f0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ter = 0;.    ret
4600: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
4610: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
4620: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
4630: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
4640: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69   name */.  for(i
4650: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
4660: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 2a 70  .    cksum -= *p
4670: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
4680: 20 20 69 66 28 20 21 63 6b 73 75 6d 20 29 7b 0a    if( !cksum ){.
4690: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
46a0: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
46b0: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
46c0: 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  }.   .  return S
46d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
46e0: 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  ** Seek the jour
46f0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
4700: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
4710: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
4720: 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e  where a.** journ
4730: 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65  al header may be
4740: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
4750: 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  . Pager.journalO
4760: 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ff is updated wi
4770: 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65  th.** the new se
4780: 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a  ek offset..**.**
4790: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
47a0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
47b0: 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65  *.** Input Offse
47c0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  t              O
47d0: 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20  utput Offset.** 
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20  -------.** 0    
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20       0.** 512   
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20      512.** 100  
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30       512.** 2000
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
4890: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
48a0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  kJournalHdr(Page
48b0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f 66  r *pPager){.  of
48c0: 66 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  f_t offset = 0;.
48d0: 20 20 6f 66 66 5f 74 20 63 20 3d 20 70 50 61 67    off_t c = pPag
48e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
48f0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
4900: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
4910: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
4920: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
4930: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
4940: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
4950: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
4960: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4970: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
4980: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
4990: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
49a0: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
49b0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  Z(pPager) );.  p
49c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
49d0: 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65  f = offset;.  re
49e0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65  turn sqlite3OsSe
49f0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
4a00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
4a10: 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Off);.}../*.** T
4a20: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4a30: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
4a40: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
4a50: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
4a60: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
4a70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
4a80: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
4a90: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
4aa0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
4ab0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
4ac0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
4ad0: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
4ae0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
4af0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
4b00: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
4b10: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
4b20: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
4b30: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
4b40: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
4b50: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
4b60: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
4b70: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
4b80: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
4b90: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
4ba0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
4bb0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
4bc0: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
4bd0: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
4be0: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
4bf0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
4c00: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
4c10: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
4c20: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
4c30: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
4c40: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
4c50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4c60: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
4c70: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
4c80: 20 20 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a    int rc = seekJ
4c90: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
4ca0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
4cb0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67  turn rc;..  pPag
4cc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
4cd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
4ce0: 4f 66 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65  Off;.  if( pPage
4cf0: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30  r->stmtHdrOff==0
4d00: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
4d10: 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61  stmtHdrOff = pPa
4d20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b  ger->journalHdr;
4d30: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
4d40: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
4d50: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
4d60: 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d  er);..  /* FIX M
4d70: 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f  E: .  **.  ** Po
4d80: 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67  ssibly for a pag
4d90: 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  er not in no-syn
4da0: 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
4db0: 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64  nal magic should
4dc0: 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69   not.  ** be wri
4dd0: 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20  tten until nRec 
4de0: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  is filled in as 
4df0: 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e  part of next syn
4e00: 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a  cJournal(). .  *
4e10: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20  *.  ** Actually 
4e20: 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20  maybe the whole 
4e30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
4e40: 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64  hould be delayed
4e50: 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a   until that.  **
4e60: 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62   point. Think ab
4e70: 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  out this..  */. 
4e80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
4e90: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
4ea0: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
4eb0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
4ec0: 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 69 66 28  lMagic));..  if(
4ed0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4ee0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 52 65  {.    /* The nRe
4ef0: 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46  c Field. 0xFFFFF
4f00: 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20  FFF for no-sync 
4f10: 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 20  journals. */.   
4f20: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
4f30: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
4f40: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
4f50: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29   0xffffffff : 0)
4f60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
4f70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4f80: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
4f90: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
4fa0: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20 20 73 71  liser */ .    sq
4fb0: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
4fc0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
4fd0: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
4fe0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
4ff0: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
5000: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5010: 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  d, pPager->cksum
5020: 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Init);.  }.  if(
5030: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5040: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 69  {.    /* The ini
5050: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
5060: 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77  ze */.    rc = w
5070: 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
5080: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
5090: 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  >dbSize);.  }.  
50a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
50b0: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  K ){.    /* The 
50c0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
50d0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
50e0: 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  cess */.    rc =
50f0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
5100: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
5110: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
5120: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f    }..  /* The jo
5130: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
5140: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75   been written su
5150: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b  ccessfully. Seek
5160: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
5170: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
5180: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
5190: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
51a0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a  er sector..  */.
51b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
51c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
51d0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
51e0: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
51f0: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20  ournalOff-1);.  
5200: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5210: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
5220: 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a  fd, "\000", 1);.
5230: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
5250: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
5260: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
5270: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
5280: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
5290: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
52a0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
52b0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
52c0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
52d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
52e0: 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65   file. See comme
52f0: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
5300: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
5310: 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72  dr() for a descr
5320: 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  iption of.** the
5330: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5340: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
5350: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
5360: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
5370: 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74  , *nRec is set t
5380: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
5390: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
53a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
53b0: 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a  eader and *dbSiz
53c0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
53d0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
53e0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
53f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
5400: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
5410: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
5420: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
5430: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
5440: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
5450: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
5460: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
5470: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
5480: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
5490: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
54a0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
54b0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
54c0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
54d0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52  returned and *nR
54e0: 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61  ec and *dbSize a
54f0: 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20  re not set.  If 
5500: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
5510: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
5520: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
5530: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
5540: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
5550: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
5560: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
5570: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
5580: 50 61 67 65 72 2c 20 0a 20 20 6f 66 66 5f 74 20  Pager, .  off_t 
5590: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
55a0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
55b0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
55c0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
55d0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
55e0: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
55f0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
5600: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
5610: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5620: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5630: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5640: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
5650: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
5660: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5670: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
5680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5690: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
56a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
56b0: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a 66  Read(&pPager->jf
56c0: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
56d0: 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66  f(aMagic));.  if
56e0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
56f0: 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  ;..  if( memcmp(
5700: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
5710: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
5720: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
5730: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
5740: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ONE;.  }..  rc =
5750: 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61   read32bits(&pPa
5760: 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29  ger->jfd, pNRec)
5770: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
5780: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5790: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
57a0: 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
57b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
57c0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
57d0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
57e0: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
57f0: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
5800: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
5810: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
5820: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
5830: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
5840: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
5850: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
5860: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
5870: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
5880: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
5890: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
58a0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
58b0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
58c0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
58d0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
58e0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
58f0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
5900: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
5910: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
5920: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
5930: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
5940: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
5950: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
5960: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
5970: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
5980: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
5990: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
59a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
59b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
59c0: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
59d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
59e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
59f0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
5a00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5a10: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
5a20: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
5a30: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
5a40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5a50: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
5a60: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
5a70: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
5a80: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
5a90: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
5aa0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
5ab0: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
5ac0: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
5ad0: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
5ae0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
5af0: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
5b00: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
5b10: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
5b20: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
5b30: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
5b40: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
5b50: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
5b60: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
5b70: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
5b80: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
5b90: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
5ba0: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
5bb0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
5bc0: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
5bd0: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
5be0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
5bf0: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
5c00: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
5c10: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
5c20: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
5c30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
5c40: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
5c50: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
5c60: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
5c70: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
5c80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5c90: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
5ca0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
5cb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
5cc0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
5cd0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
5ce0: 6e 74 20 69 3b 20 0a 20 20 69 6e 74 20 63 6b 73  nt i; .  int cks
5cf0: 75 6d 20 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20  um = 0; ..  if( 
5d00: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
5d10: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
5d20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5d30: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
5d40: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
5d50: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
5d60: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
5d70: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
5d80: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
5d90: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
5da0: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
5db0: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
5dc0: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
5dd0: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
5de0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
5df0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5e00: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
5e10: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
5e20: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
5e30: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
5e40: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
5e50: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
5e60: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
5e70: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
5e80: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
5e90: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
5ea0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5eb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5ec0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5ed0: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
5ee0: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
5ef0: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5f00: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
5f10: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
5f20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5f30: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5f40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
5f50: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
5f60: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b  , zMaster, len);
5f70: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5f80: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
5f90: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
5fa0: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5fb0: 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  fd, len);.  if( 
5fc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5fd0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5fe0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
5ff0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73  pPager->jfd, cks
6000: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
6010: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6020: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
6030: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
6040: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
6050: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6060: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
6070: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
6080: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
6090: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
60a0: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
60b0: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
60c0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
60d0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
60e0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
60f0: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
6100: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
6110: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
6120: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
6130: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
6140: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
6150: 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
6160: 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69  ommit().** routi
6170: 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74  ne run MUCH fast
6180: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
6190: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
61a0: 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70  re are many.** p
61b0: 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62  ages in memory b
61c0: 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72  ut only a few ar
61d0: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
61e0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
61f0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
6200: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
6210: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
6220: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
6230: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
6240: 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  f( pPg->inStmt )
6250: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
6260: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
6270: 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65  t==0 && pPg->pNe
6280: 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70  xtStmt==0 );.  p
6290: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
62a0: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
62b0: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50  >pStmt ){.    pP
62c0: 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72  ager->pStmt->pPr
62d0: 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  evStmt = pPg;.  
62e0: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  }.  pPg->pNextSt
62f0: 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74  mt = pPager->pSt
6300: 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53  mt;.  pPager->pS
6310: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  tmt = pPg;.  pPg
6320: 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a  ->inStmt = 1;.}.
6330: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
6340: 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
6350: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
6360: 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  g){.  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 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
6390: 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  vStmt ){.    ass
63a0: 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53  ert( pPg->pPrevS
63b0: 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  tmt->pNextStmt==
63c0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
63d0: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
63e0: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
63f0: 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tStmt;.  }else{.
6400: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
6410: 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d  >pPager->pStmt==
6420: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
6430: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
6440: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
6450: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
6460: 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  NextStmt ){.    
6470: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
6480: 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  xtStmt->pPrevStm
6490: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
64a0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
64b0: 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
64c0: 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20  PrevStmt;.  }.  
64d0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
64e0: 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   0;.  pPg->pPrev
64f0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
6500: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a  >inStmt = 0;.}..
6510: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
6520: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
6530: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
6540: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
6550: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
6560: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
6570: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
6580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
6590: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
65a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
65b0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
65c0: 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e  dr *p = pPager->
65d0: 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68  aHash[pager_hash
65e0: 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65  (pgno)];.  while
65f0: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
6600: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
6610: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
6620: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
6630: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
6640: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
6650: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
6660: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
6670: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
6680: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
6690: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
66a0: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
66b0: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
66c0: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
66d0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
66e0: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
66f0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
6700: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
6710: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
6720: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
6730: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
6740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6750: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
6760: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
6770: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
6780: 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  t;.  for(pPg=pPa
6790: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
67a0: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
67b0: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
67c0: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
67d0: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
67e0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
67f0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
6800: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
6810: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
6820: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
6830: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d  >pAll = 0;.  mem
6840: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
6850: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
6860: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
6870: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
6880: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
6890: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
68a0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
68b0: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
68c0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
68d0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  .  sqlite3OsUnlo
68e0: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
68f0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  NO_LOCK);.  pPag
6900: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
6910: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  R_UNLOCK;.  pPag
6920: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
6930: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
6940: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
6950: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
6960: 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  en==0 );.}../*.*
6970: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
6980: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
6990: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
69a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
69b0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45  en and.** a RESE
69c0: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
69d0: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
69e0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
69f0: 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a  utine releases.*
6a00: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
6a10: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
6a20: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
6a30: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68  n its place.  Th
6a40: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
6a50: 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64  e is deleted and
6a60: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
6a70: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
6a80: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
6a90: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
6aa0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
6ab0: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
6ac0: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
6ad0: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
6ae0: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
6af0: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
6b00: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
6b10: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
6b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
6b30: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
6b40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6b50: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
6b60: 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
6b70: 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 69 66 28 20  >memDb );.  if( 
6b80: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
6b90: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
6ba0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6bb0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
6bc0: 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
6bd0: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
6be0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
6bf0: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
6c00: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
6c10: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
6c20: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
6c30: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
6c40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
6c50: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
6c60: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
6c70: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67  ->jfd);.    pPag
6c80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
6c90: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
6ca0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
6cb0: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
6cc0: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
6cd0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
6ce0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
6cf0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
6d00: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
6d10: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
6d20: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
6d30: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
6d40: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
6d50: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
6d60: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
6d70: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
6d80: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
6d90: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
6da0: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
6db0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
6dc0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
6dd0: 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
6de0: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
6df0: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73  al==0 );.  }.  s
6e00: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
6e10: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
6e20: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  ED_LOCK);.  pPag
6e30: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
6e40: 52 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67  R_SHARED;.  pPag
6e50: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
6e60: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
6e70: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72  tMaster = 0;.  r
6e80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
6ea0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
6eb0: 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
6ec0: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  page of data..**
6ed0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
6ee0: 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
6ef0: 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a    It is really j
6f00: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
6f10: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
6f20: 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20  itial value and 
6f30: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  the page number.
6f40: 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65    We experimente
6f50: 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63  d with.** a chec
6f60: 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69  ksum of the enti
6f70: 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61  re data, but tha
6f80: 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62  t was found to b
6f90: 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a  e too slow..**.*
6fa0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
6fb0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73  page number is s
6fc0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67  tored at the beg
6fd0: 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61  inning of data a
6fe0: 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73  nd.** the checks
6ff0: 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  um is stored at 
7000: 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69  the end.  This i
7010: 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66  s important.  If
7020: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72   journal.** corr
7030: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
7040: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
7050: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
7060: 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a  ikely scenario.*
7070: 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  * is that one en
7080: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
7090: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
70a0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49  l be changed.  I
70b0: 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73  t is.** much les
70c0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
70d0: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
70e0: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
70f0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
7100: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
7110: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
7120: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
7130: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
7140: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
7150: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
7160: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
7170: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
7180: 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58  ption..**.** FIX
7190: 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61   ME:  Consider a
71a0: 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74  dding every 200t
71b0: 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f  h (or so) byte o
71c0: 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  f the data to th
71d0: 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20  e.** checksum.  
71e0: 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69  That way if a si
71f0: 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20  ngle page spans 
7200: 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73  3 or more disk s
7210: 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e  ectors and.** on
7220: 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65  ly the middle se
7230: 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c  ctor is corrupt,
7240: 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68   we will still h
7250: 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ave a reasonable
7260: 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61  .** chance of fa
7270: 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  iling the checks
7280: 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65  um and thus dete
7290: 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  cting the proble
72a0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  m..*/.static u32
72b0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
72c0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
72d0: 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61   pgno, const cha
72e0: 72 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  r *aData){.  u32
72f0: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
7300: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
7310: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
7320: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
7330: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
7340: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
7350: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
7360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
7370: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
7380: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
7390: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
73a0: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
73b0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
73c0: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
73d0: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
73e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
73f0: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
7400: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
7410: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
7420: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
7430: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
7440: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
7450: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
7460: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
7470: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
7480: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
7490: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
74a0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
74b0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
74c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
74d0: 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74  OsFile *jfd, int
74e0: 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e   useCksum){.  in
74f0: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
7500: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
7510: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
7520: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
7530: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
7540: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
7550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7560: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
7570: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
7580: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
7590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
75a0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
75b0: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
75c0: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
75d0: 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 50  8 aData[SQLITE_P
75e0: 41 47 45 5f 53 49 5a 45 5d 3b 20 20 20 2f 2a 20  AGE_SIZE];   /* 
75f0: 53 74 6f 72 65 20 64 61 74 61 20 68 65 72 65 20  Store data here 
7600: 2a 2f 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  */..  rc = read3
7610: 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f  2bits(jfd, &pgno
7620: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7630: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7640: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
7650: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61  e3OsRead(jfd, &a
7660: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
7670: 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  geSize);.  if( r
7680: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
7690: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
76a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
76b0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
76c0: 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61  ze + 4;..  /* Sa
76d0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
76e0: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
76f0: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
7700: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
7710: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
7720: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
7730: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
7740: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
7750: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
7760: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
7770: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
7780: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
7790: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
77a0: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
77b0: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
77c0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
77d0: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
77e0: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
77f0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
7800: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
7810: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
7820: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
7830: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
7840: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
7850: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
7860: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
7870: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7880: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43  ;.  }.  if( useC
7890: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  ksum ){.    rc =
78a0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
78b0: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
78c0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
78d0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
78e0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
78f0: 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73     if( pager_cks
7900: 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  um(pPager, pgno,
7910: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
7920: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
7930: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
7940: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
7950: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
7960: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
7970: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
7980: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
7990: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
79a0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
79b0: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
79c0: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
79d0: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
79e0: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
79f0: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
7a00: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
7a10: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
7a20: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
7a30: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7a40: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
7a50: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
7a60: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
7a70: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
7a80: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
7a90: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
7aa0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
7ab0: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
7ac0: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
7ad0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
7ae0: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
7af0: 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 50  dirty..  */.  pP
7b00: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
7b10: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
7b20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
7b30: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
7b40: 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 20  XCLUSIVE || pPg 
7b50: 29 3b 0a 20 20 54 52 41 43 45 32 28 22 50 4c 41  );.  TRACE2("PLA
7b60: 59 42 41 43 4b 20 70 61 67 65 20 25 64 5c 6e 22  YBACK page %d\n"
7b70: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
7b80: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
7b90: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
7ba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
7bb0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
7bc0: 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29  (pgno-1)*(off_t)
7bd0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
7be0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
7bf0: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
7c00: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 53  er->fd, aData, S
7c10: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
7c20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
7c30: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
7c40: 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
7c50: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
7c60: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
7c70: 65 70 74 20 66 6f 72 20 70 61 67 65 0a 20 20 20  ept for page.   
7c80: 20 2a 2a 20 31 20 77 68 69 63 68 20 69 73 20 68   ** 1 which is h
7c90: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
7ca0: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
7cb0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
7cc0: 62 61 73 65 0a 20 20 20 20 2a 2a 20 61 63 74 69  base.    ** acti
7cd0: 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ve..    */.    v
7ce0: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
7cf0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
7d00: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
7d10: 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 70 44 61 74  o==1 );.    pDat
7d20: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
7d30: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
7d40: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
7d50: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7d60: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
7d70: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
7d80: 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a  ){  /*** FIX ME:
7d90: 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65    Should this be
7da0: 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20   xReinit? ***/. 
7db0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
7dc0: 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
7dd0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7de0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7df0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
7e00: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
7e10: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  ){.      pPg->di
7e20: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
7e30: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
7e40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 4f 44 45  ;.    }.    CODE
7e50: 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
7e60: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
7e70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
7e90: 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
7ea0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
7eb0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
7ec0: 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
7ed0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
7ee0: 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
7ef0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7f00: 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
7f10: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
7f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
7f30: 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
7f40: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
7f50: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
7f60: 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
7f70: 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
7f80: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  is..**.** The ma
7f90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
7fa0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
7fb0: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c  ames of all chil
7fc0: 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  d journals..** T
7fd0: 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74  o tell if a mast
7fe0: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
7ff0: 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b  e deleted, check
8000: 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a   to each of the.
8010: 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66  ** children.  If
8020: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72   all children ar
8030: 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67  e either missing
8040: 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72   or do not refer
8050: 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65   to.** a differe
8060: 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nt master journa
8070: 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73  l, then this mas
8080: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
8090: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  be deleted..*/.s
80a0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
80b0: 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20  delmaster(const 
80c0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
80d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
80e0: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
80f0: 0a 20 20 4f 73 46 69 6c 65 20 6d 61 73 74 65 72  .  OsFile master
8100: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
8110: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
8120: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
8130: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8140: 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 6e 4d 61 73   */.  off_t nMas
8150: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
8160: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
8170: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
8180: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
8190: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
81a0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
81b0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
81c0: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
81d0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
81e0: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
81f0: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
8200: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
8210: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ence..  */.  mem
8220: 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30 2c 20  set(&master, 0, 
8230: 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29 29 3b  sizeof(master));
8240: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8250: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
8260: 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 2c  Master, &master,
8270: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
8280: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
8290: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
82a0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
82b0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
82c0: 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61 73 74  OsFileSize(&mast
82d0: 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
82e0: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
82f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
8300: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
8310: 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
8320: 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
8330: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
8340: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
8350: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  Ptr = 0;..    /*
8360: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
8370: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8380: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
8390: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
83a0: 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f    ** sqliteMallo
83b0: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
83c0: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
83d0: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
83e0: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
83f0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
8400: 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  eMalloc(nMasterJ
8410: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
8420: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
8430: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
8440: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8450: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
8460: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
8470: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
8480: 65 61 64 28 26 6d 61 73 74 65 72 2c 20 7a 4d 61  ead(&master, zMa
8490: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61  sterJournal, nMa
84a0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
84b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
84c0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
84d0: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
84e0: 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
84f0: 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
8500: 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
8510: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
8520: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
8530: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
8540: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
8550: 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20  Journal) ){.    
8560: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
8570: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
8580: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
8590: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
85a0: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
85b0: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
85c0: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
85d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
85e0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
85f0: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
8600: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
8610: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8620: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
8630: 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c  */.        OsFil
8640: 65 20 6a 6f 75 72 6e 61 6c 3b 0a 0a 20 20 20 20  e journal;..    
8650: 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f 75 72      memset(&jour
8660: 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6a  nal, 0, sizeof(j
8670: 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20 20 20  ournal));.      
8680: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8690: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f  OpenReadOnly(zJo
86a0: 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29  urnal, &journal)
86b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
86c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
86d0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
86e0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
86f0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
8700: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
8710: 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c  ournal(&journal,
8720: 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20   &zMasterPtr);. 
8730: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
8740: 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b  Close(&journal);
8750: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
8760: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8770: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
8780: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
8790: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
87a0: 66 28 20 7a 4d 61 73 74 65 72 50 74 72 20 26 26  f( zMasterPtr &&
87b0: 20 21 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72   !strcmp(zMaster
87c0: 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 20 29 7b  Ptr, zMaster) ){
87d0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
87e0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
87f0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
8800: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8810: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
8820: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
8830: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
8840: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
8850: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
8860: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
8870: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
8880: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
8890: 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61  zMaster);..delma
88a0: 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
88b0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
88c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
88d0: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
88e0: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
88f0: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
8900: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
8910: 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  &master);.  }.  
8920: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8930: 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70  .** Make every p
8940: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
8950: 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61 74   agree with what
8960: 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e   is on disk.  In
8970: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a   other words,.**
8980: 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73 6b   reread the disk
8990: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
89a0: 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68 65  ate of the cache
89b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
89c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
89d0: 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  fter a rollback 
89e0: 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66  in which some of
89f0: 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68 65   the dirty cache
8a00: 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65  .** pages had ne
8a10: 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
8a20: 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57   out to disk.  W
8a30: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62  e need to roll b
8a40: 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65  ack the.** cache
8a50: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
8a60: 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
8a70: 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72 65  do that is to re
8a80: 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e  read the old con
8a90: 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f  tent.** back fro
8aa0: 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73  m the disk..*/.s
8ab0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
8ac0: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67  reload_cache(Pag
8ad0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
8ae0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
8af0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8b00: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
8b10: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
8b20: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
8b30: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
8b40: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
8b50: 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  ];.    if( !pPg-
8b60: 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75  >dirty ) continu
8b70: 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  e;.    if( (int)
8b80: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
8b90: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
8ba0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8bb0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
8bc0: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
8bd0: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 28 70 50 67  SIZE*(off_t)(pPg
8be0: 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20  ->pgno-1));.    
8bf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8c00: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
8c10: 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50  , zBuf, SQLITE_P
8c20: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
8c30: 20 54 52 41 43 45 32 28 22 52 45 46 45 54 43 48   TRACE2("REFETCH
8c40: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
8c50: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
8c60: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75  ODEC(pPager, zBu
8c70: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
8c80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
8c90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
8ca0: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
8cb0: 7a 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f  zBuf, 0, SQLITE_
8cc0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
8cd0: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
8ce0: 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  Ref==0 || memcmp
8cf0: 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f  (zBuf, PGHDR_TO_
8d00: 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54  DATA(pPg), SQLIT
8d10: 45 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 7b 0a  E_PAGE_SIZE) ){.
8d20: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
8d30: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
8d40: 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50 41   zBuf, SQLITE_PA
8d50: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
8d60: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
8d70: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
8d80: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
8d90: 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
8da0: 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
8db0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
8dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
8dd0: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
8de0: 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50  XTRA(pPg), 0, pP
8df0: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
8e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8e10: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
8e20: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   0;.    pPg->dir
8e30: 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
8e40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8e50: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
8e60: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
8e70: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
8e80: 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
8e90: 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
8ea0: 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
8eb0: 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
8ec0: 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
8ed0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
8ee0: 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
8ef0: 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
8f00: 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
8f10: 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
8f20: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
8f30: 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
8f40: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
8f50: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
8f60: 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
8f70: 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
8f80: 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
8f90: 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
8fa0: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
8fb0: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
8fc0: 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
8fd0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
8fe0: 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
8ff0: 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
9000: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
9010: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
9020: 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
9030: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
9040: 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
9050: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
9060: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
9070: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
9080: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
9090: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
90a0: 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
90b0: 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
90c0: 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
90d0: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
90e0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
90f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
9100: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9110: 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e  l.**       name.
9120: 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20    The value may 
9130: 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74  be zero (indicat
9140: 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  e that there is 
9150: 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  no master.**    
9160: 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20     journal.).** 
9170: 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66   (6)  N bytes of
9180: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9190: 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e  nal name.  The n
91a0: 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d  ame will be nul-
91b0: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20  terminated.**   
91c0: 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65      and might be
91d0: 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68   shorter than th
91e0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
91f0: 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66  m (5).  If the f
9200: 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  irst byte.**    
9210: 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69     of the name i
9220: 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72  s \000 then ther
9230: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a  e is no master j
9240: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73  ournal.  The mas
9250: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
9260: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f  rnal name is sto
9270: 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  red in UTF-8..**
9280: 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (7)  Zero or m
9290: 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
92a0: 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
92b0: 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
92c0: 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
92d0: 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
92e0: 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
92f0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
9300: 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
9310: 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
9320: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
9330: 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
9340: 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
9350: 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20  ean the first 6 
9360: 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
9370: 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
9380: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
9390: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
93a0: 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  7th item..**.** 
93b0: 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
93c0: 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
93d0: 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
93e0: 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
93f0: 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
9400: 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
9410: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
9420: 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
9430: 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
9440: 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
9450: 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
9460: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9470: 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
9480: 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
9490: 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
94a0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
94b0: 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
94c0: 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
94d0: 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
94e0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
94f0: 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
9500: 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
9510: 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
9520: 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
9530: 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
9540: 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
9550: 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
9560: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
9570: 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
9580: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
9590: 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
95a0: 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
95b0: 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
95c0: 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
95d0: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
95e0: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
95f0: 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
9600: 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
9610: 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
9620: 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
9630: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
9640: 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
9650: 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
9660: 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
9670: 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
9680: 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
9690: 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
96a0: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
96b0: 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
96c0: 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
96d0: 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
96e0: 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
96f0: 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
9700: 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
9710: 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
9720: 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
9730: 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
9740: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
9750: 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
9760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9770: 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
9780: 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
9790: 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
97a0: 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
97b0: 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
97c0: 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
97d0: 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
97e0: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
97f0: 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
9800: 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
9810: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
9820: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
9830: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
9840: 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
9850: 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
9860: 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
9870: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
9880: 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
9890: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
98a0: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
98b0: 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
98c0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
98d0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
98e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
98f0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
9900: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f 66  r *pPager){.  of
9910: 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  f_t szJ;        
9920: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9930: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
9940: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
9950: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
9960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9970: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
9980: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
9990: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
99b0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
99c0: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
99d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
99e0: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
99f0: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
9a00: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a20: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
9a30: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
9a40: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
9a50: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
9a60: 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
9a70: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
9a80: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
9a90: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
9aa0: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
9ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
9ac0: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
9ad0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
9ae0: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
9af0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
9b00: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
9b10: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
9b20: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
9b30: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
9b40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9b50: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
9b60: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
9b70: 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
9b80: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
9b90: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
9ba0: 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
9bb0: 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
9bc0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9bd0: 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
9be0: 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
9bf0: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
9c00: 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
9c10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
9c20: 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
9c30: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
9c40: 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
9c50: 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72  k..  */.  rc = r
9c60: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
9c70: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
9c80: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65  zMaster);.  asse
9c90: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
9ca0: 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ONE );.  if( rc!
9cb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a  =SQLITE_OK || (z
9cc0: 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74  Master && !sqlit
9cd0: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
9ce0: 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20  Master)) ){.    
9cf0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
9d00: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
9d10: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
9d20: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
9d30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9d40: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
9d50: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c  yback;.  }.  sql
9d60: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
9d70: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70  er->jfd, 0);.  p
9d80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9d90: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
9da0: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
9db0: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
9dc0: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
9dd0: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
9de0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
9df0: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
9e00: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
9e10: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
9e20: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
9e30: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
9e40: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
9e50: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
9e60: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
9e70: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
9e80: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
9e90: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
9ea0: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
9eb0: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
9ec0: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
9ed0: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
9ee0: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
9ef0: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
9f00: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
9f10: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
9f20: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
9f30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
9f40: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
9f50: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
9f60: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
9f70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9f80: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
9f90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
9fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
9fb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
9fc0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
9fd0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
9fe0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
9ff0: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
a000: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
a010: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
a020: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
a030: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
a040: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
a050: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
a060: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
a070: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
a080: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
a090: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
a0a0: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
a0b0: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
a0c0: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
a0d0: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
a0e0: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
a0f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a100: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
a110: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
a120: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
a130: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
a140: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
a150: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
a160: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
a170: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
a180: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
a190: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
a1a0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
a1b0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
a1c0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
a1d0: 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
a1e0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
a1f0: 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
a200: 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  t's original siz
a210: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
a220: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
a230: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
a240: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
a250: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a260: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
a270: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f  ==0 || pPager->o
a280: 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20  rigDbSize==mxPg 
a290: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
a2a0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
a2b0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  &pPager->fd, SQL
a2c0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f  ITE_PAGE_SIZE*(o
a2d0: 66 66 5f 74 29 6d 78 50 67 29 3b 0a 20 20 20 20  ff_t)mxPg);.    
a2e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a2f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
a300: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
a310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a320: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
a330: 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
a340: 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c 69 74 65    /* rc = sqlite
a350: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
a360: 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41 4c 5f 48 44  >jfd, JOURNAL_HD
a370: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 20 2a  R_SZ(pPager)); *
a380: 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  /.    if( rc!=SQ
a390: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
a3a0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 0a  nd_playback;.  .
a3b0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
a3c0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
a3d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
a3e0: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
a3f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
a400: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
a410: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
a420: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
a430: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
a440: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
a450: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
a460: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a470: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a480: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a490: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
a4a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
a4b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
a4c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
a4d0: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
a4e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
a4f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a500: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
a510: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
a520: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
a530: 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74 20    /* Pages that 
a540: 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
a550: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
a560: 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63 65   but never synce
a570: 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f 74  d.  ** where not
a580: 20 72 65 73 74 6f 72 65 64 20 62 79 20 74 68 65   restored by the
a590: 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57 65   loop above.  We
a5a0: 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72 65   have to restore
a5b0: 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67 65   those.  ** page
a5c0: 73 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65  s by reading the
a5d0: 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  m back from the 
a5e0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
a5f0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
a600: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a610: 29 3b 0a 20 20 70 61 67 65 72 5f 72 65 6c 6f 61  );.  pager_reloa
a620: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
a630: 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
a640: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b    if( zMaster ){
a650: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
a660: 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
a670: 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
a680: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
a690: 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20  rn true,.    ** 
a6a0: 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
a6b0: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
a6c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a6d0: 61 6c 2e 20 49 66 20 65 72 72 6f 72 73 20 0a 20  al. If errors . 
a6e0: 20 20 20 2a 2a 20 6f 63 63 75 72 20 64 75 72 69     ** occur duri
a6f0: 6e 67 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c  ng this process,
a700: 20 69 67 6e 6f 72 65 20 74 68 65 6d 2e 0a 20 20   ignore them..  
a710: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
a720: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a730: 20 20 20 20 70 61 67 65 72 5f 64 65 6c 6d 61 73      pager_delmas
a740: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
a750: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
a760: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
a770: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
a780: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
a790: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
a7a0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
a7b0: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
a7c0: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
a7d0: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
a7e0: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
a7f0: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
a800: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
a810: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
a820: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
a830: 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  t PAGER_SECTOR_S
a840: 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  IZE.  ** value. 
a850: 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
a860: 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
a870: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
a880: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73    */.  pPager->s
a890: 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45  ectorSize = PAGE
a8a0: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  R_SECTOR_SIZE;. 
a8b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a8c0: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
a8d0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
a8e0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
a8f0: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c  is similar to pl
a900: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74  aying back the t
a910: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
a920: 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61  al but with.** a
a930: 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74   few extra twist
a940: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
a950: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   The number of p
a960: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
a970: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
a980: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20   start of.**    
a990: 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65       the stateme
a9a0: 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
a9b0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
a9c0: 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20  , not in the.** 
a9d0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
a9e0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  file itself..**.
a9f0: 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64  **    (2)  In ad
aa00: 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e  dition to playin
aa10: 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  g back the state
aa20: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c  ment journal, al
aa30: 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c  so.**         pl
aa40: 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73  ayback all pages
aa50: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
aa60: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69  ion journal begi
aa70: 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  nning.**        
aa80: 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65   at offset pPage
aa90: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f  r->stmtJSize..*/
aaa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
aab0: 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
aac0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
aad0: 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20    off_t szJ;    
aae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
aaf0: 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a  ze of the full j
ab00: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 6f 66 66 5f  ournal */.  off_
ab10: 74 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20  t hdrOff;.  int 
ab20: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
ab30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ab40: 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  f Records */.  i
ab50: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
ab60: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ab70: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
ab80: 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50   rc;..  szJ = pP
ab90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
aba0: 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
abb0: 20 0a 20 20 7b 0a 20 20 20 20 6f 66 66 5f 74 20   .  {.    off_t 
abc0: 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d  os_szJ;.    rc =
abd0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
abe0: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
abf0: 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69   &os_szJ);.    i
ac00: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ac10: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
ac20: 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f    assert( szJ==o
ac30: 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e  s_szJ );.  }.#en
ac40: 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64  dif..  /* Set hd
ac50: 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f  rOff to be the o
ac60: 66 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  ffset to the fir
ac70: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
ac80: 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  r written.  ** t
ac90: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
aca0: 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68  ansaction, or th
acb0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
acc0: 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
acd0: 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
ace0: 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
acf0: 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
ad00: 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
ad10: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
ad20: 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
ad30: 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
ad40: 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
ad50: 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
ad60: 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
ad70: 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
ad80: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
ad90: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
ada0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
adb0: 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  cate(&pPager->fd
adc0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
add0: 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61 67 65 72  ZE*(off_t)pPager
ade0: 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 70  ->stmtSize);.  p
adf0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
ae00: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
ae10: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
ae20: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
ae30: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  rds are in the s
ae40: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
ae50: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
ae60: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
ae70: 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  se && pPager->jo
ae80: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
ae90: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
aea0: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
aeb0: 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d    nRec = pPager-
aec0: 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20  >stmtNRec;.  .  
aed0: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
aee0: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
aef0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
af00: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
af10: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
af20: 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20  ase file.  Note 
af30: 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
af40: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73  nt journal omits
af50: 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a   checksums from.
af60: 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64    ** each record
af70: 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69   since power-fai
af80: 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73  lure recovery is
af90: 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74   not important t
afa0: 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  o statement.  **
afb0: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a   journals..  */.
afc0: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
afd0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
afe0: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
aff0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
b000: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  ger, &pPager->st
b010: 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  fd, 0);.    asse
b020: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
b030: 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
b040: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b050: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
b060: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
b070: 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70   Now roll some p
b080: 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74  ages back from t
b090: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
b0a0: 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74  ournal. Pager.st
b0b0: 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73  mtJSize.  ** was
b0c0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
b0d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
b0e0: 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
b0f0: 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73  t was started, s
b100: 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e  o.  ** everythin
b110: 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65  g after that nee
b120: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
b130: 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74  back, either int
b140: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
b150: 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20  ase, the memory 
b160: 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a  cache, or both..
b170: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20    **.  ** If it 
b180: 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
b190: 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f  n Pager.stmtHdrO
b1a0: 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74  ff is the offset
b1b0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
b1c0: 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
b1d0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
b1e0: 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68  ritten during th
b1f0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  is statement tra
b200: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
b210: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
b220: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
b230: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  , pPager->stmtJS
b240: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
b250: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b260: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
b270: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
b280: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b290: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
b2a0: 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
b2b0: 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
b2c0: 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
b2d0: 20 20 61 73 73 65 72 74 28 20 4a 4f 55 52 4e 41    assert( JOURNA
b2e0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
b2f0: 3c 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  <(pPager->pageSi
b300: 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c 65  ze+8) );.  while
b310: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
b320: 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d  lOff <= (hdrOff-
b330: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
b340: 65 2b 38 29 29 20 29 7b 0a 20 20 20 20 72 63 20  e+8)) ){.    rc 
b350: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
b360: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
b370: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
b380: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
b390: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
b3a0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
b3b0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
b3c0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
b3d0: 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  k;.  }..  while(
b3e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b3f0: 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20  Off < szJ ){.   
b400: 20 75 33 32 20 6e 52 65 63 3b 0a 20 20 20 20 75   u32 nRec;.    u
b410: 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
b420: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
b430: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
b440: 6e 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  nRec, &dummy);. 
b450: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b460: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
b470: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
b480: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67  _DONE );.      g
b490: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
b4a0: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  yback;.    }.   
b4b0: 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a   if( nRec==0 ){.
b4c0: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
b4d0: 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
b4e0: 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65  nalOff) / (pPage
b4f0: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a  r->pageSize+8);.
b500: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
b510: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20  nRec-1; i>=0 && 
b520: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b530: 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a  ff < szJ; i--){.
b540: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
b550: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
b560: 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
b570: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
b580: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
b590: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
b5a0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b5b0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
b5c0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
b5d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
b5e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b5f0: 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74  = szJ;.  .end_st
b600: 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  mt_playback:.  i
b610: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b620: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b630: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
b640: 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20  _ERR_CORRUPT;.  
b650: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
b660: 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  RRUPT;.  }else{.
b670: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
b680: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
b690: 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
b6a0: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
b6b0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
b6c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
b6d0: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
b6e0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
b6f0: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
b700: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a  are allowed..**.
b710: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
b720: 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62 73  umber is the abs
b730: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74  olute value of t
b740: 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d 65  he mxPage parame
b750: 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61 67  ter..** If mxPag
b760: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
b770: 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  he noSync flag i
b780: 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f 53  s also set.  noS
b790: 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a 20  ync bypasses.** 
b7a0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
b7b0: 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70  OsSync().  The p
b7c0: 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66  ager runs much f
b7d0: 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e  aster with noSyn
b7e0: 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20  c on,.** but if 
b7f0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
b800: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
b810: 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72 75  there is an abru
b820: 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69  pt power .** fai
b830: 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62 61  lure, the databa
b840: 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  se file might be
b850: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
b860: 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20  nsistent and.** 
b870: 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74 61  unrepairable sta
b880: 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  te.  .*/.void sq
b890: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63  lite3pager_set_c
b8a0: 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
b8b0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
b8c0: 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
b8d0: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>=0 ){.    pPag
b8e0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
b8f0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
b900: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
b910: 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
b920: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 0a 20  needSync = 0; . 
b930: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
b940: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a  er->noSync = 1;.
b950: 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78      mxPage = -mx
b960: 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Page;.  }.  if( 
b970: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
b980: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
b990: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
b9a0: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
b9b0: 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
b9c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
b9d0: 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
b9e0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
b9f0: 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
ba00: 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
ba10: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
ba20: 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
ba30: 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
ba40: 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
ba50: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
ba60: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
ba70: 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
ba80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
ba90: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
baa0: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
bab0: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
bac0: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
bad0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
bae0: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
baf0: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
bb00: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
bb10: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
bb20: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
bb30: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
bb40: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
bb50: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
bb60: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
bb70: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
bb80: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
bba0: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
bbb0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
bbc0: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
bbd0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bbe0: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
bbf0: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
bc00: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
bc10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
bc20: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
bc30: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
bc40: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
bc50: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
bc70: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
bc80: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
bc90: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
bca0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
bcb0: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
bcc0: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
bcd0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
bce0: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
bcf0: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
bd00: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
bd10: 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
bd20: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
bd30: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
bd40: 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
bd50: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
bd60: 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
bd70: 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
bd80: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
bd90: 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
bda0: 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
bdb0: 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
bdc0: 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
bdd0: 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
bde0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
bdf0: 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
be00: 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
be10: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
be20: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
be30: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
be40: 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
be50: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
be60: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
be70: 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
be80: 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
be90: 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
bea0: 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
beb0: 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
bec0: 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ULL=3..*/.void s
bed0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
bee0: 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61 67  safety_level(Pag
bef0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
bf00: 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67 65 72  level){.  pPager
bf10: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
bf20: 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
bf30: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
bf40: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
bf50: 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
bf60: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
bf70: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
bf80: 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
bf90: 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  dSync = 0;.}../*
bfa0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
bfb0: 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74  rary file.  Writ
bfc0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
bfd0: 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d  e file into zNam
bfe0: 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74  e.** (zName must
bff0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c   be at least SQL
c000: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
c010: 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20  E bytes long.)  
c020: 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c  Write.** the fil
c030: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
c040: 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
c050: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
c060: 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
c070: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
c080: 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  if we fail..**.*
c090: 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  * The OS will au
c0a0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
c0b0: 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
c0c0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
c0d0: 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  .** closed..*/.s
c0e0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
c0f0: 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
c100: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46  char *zFile, OsF
c110: 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20  ile *fd){.  int 
c120: 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72  cnt = 8;.  int r
c130: 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74  c;.  do{.    cnt
c140: 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  --;.    sqlite3O
c150: 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46  sTempFileName(zF
c160: 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ile);.    rc = s
c170: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
c180: 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c  usive(zFile, fd,
c190: 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63   1);.  }while( c
c1a0: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
c1b0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
c1c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
c1d0: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
c1e0: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
c1f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
c200: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
c210: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
c220: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
c230: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
c240: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
c250: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
c260: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
c270: 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
c280: 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  _get() and is on
c290: 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
c2a0: 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
c2b0: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
c2c0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67  using sqlite3pag
c2d0: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  er_unref()..**.*
c2e0: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
c2f0: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
c300: 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
c310: 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
c320: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
c330: 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
c340: 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
c350: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
c360: 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
c370: 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
c380: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
c390: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  t sqlite3pager_o
c3a0: 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70  pen(.  Pager **p
c3b0: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
c3c0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
c3d0: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
c3e0: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
c3f0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
c400: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
c410: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
c420: 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d   open */.  int m
c430: 78 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  xPage,          
c440: 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65      /* Max numbe
c450: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63  r of in-memory c
c460: 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a 20 20  ache pages */.  
c470: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
c480: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
c490: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
c4a0: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
c4b0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75   page */.  int u
c4c0: 73 65 4a 6f 75 72 6e 61 6c 2c 20 20 20 20 20 20  seJournal,      
c4d0: 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f 20 75      /* TRUE to u
c4e0: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
c4f0: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
c500: 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 20 2a 70  le */.  void  *p
c510: 42 75 73 79 48 61 6e 64 6c 65 72 20 20 20 20 20  BusyHandler     
c520: 20 2f 2a 20 42 75 73 79 20 63 61 6c 6c 62 61 63   /* Busy callbac
c530: 6b 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20  k */.){.  Pager 
c540: 2a 70 50 61 67 65 72 3b 0a 20 20 63 68 61 72 20  *pPager;.  char 
c550: 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
c560: 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65   0;.  int nameLe
c570: 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a  n;.  OsFile fd;.
c580: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c590: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
c5a0: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
c5b0: 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  0;.  int memDb =
c5c0: 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   0;.  int readOn
c5d0: 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ly = 0;.  char z
c5e0: 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
c5f0: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a  NAME_SIZE];..  *
c600: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d  ppPager = 0;.  m
c610: 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69  emset(&fd, 0, si
c620: 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20 69 66 28  zeof(fd));.  if(
c630: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
c640: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  failed ){.    re
c650: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
c660: 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69  M;.  }.  if( zFi
c670: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
c680: 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66  ame[0] ){.    if
c690: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
c6a0: 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
c6b0: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
c6c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c   = 1;.      zFul
c6d0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
c6e0: 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20  teStrDup("");.  
c6f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c700: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
c710: 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61       zFullPathna
c720: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
c730: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
c740: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
c750: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29   zFullPathname )
c760: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
c770: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
c780: 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e  Write(zFullPathn
c790: 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f  ame, &fd, &readO
c7a0: 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nly);.      }.  
c7b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
c7c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
c7d0: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
c7e0: 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69  p, &fd);.    zFi
c7f0: 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a  lename = zTemp;.
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 33 4f 73 46 75 6c  e = sqlite3OsFul
c820: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
c830: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
c840: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c850: 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20       tempFile = 
c860: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
c870: 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
c880: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
c890: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
c8a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c8b0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
c8c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c8d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
c8e0: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73  lose(&fd);.    s
c8f0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
c900: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
c910: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e  turn rc;.  }.  n
c920: 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
c930: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
c940: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
c950: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
c960: 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c  *pPager) + nameL
c970: 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 69  en*3 + 30 );.  i
c980: 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a  f( pPager==0 ){.
c990: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
c9a0: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  se(&fd);.    sql
c9b0: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
c9c0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
c9d0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
c9e0: 0a 20 20 7d 0a 20 20 53 45 54 5f 50 41 47 45 52  .  }.  SET_PAGER
c9f0: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
ca00: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
ca10: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
ca20: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
ca30: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
ca40: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
ca50: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
ca60: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
ca70: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
ca80: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
ca90: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
caa0: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
cab0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
cac0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
cad0: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
cae0: 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  name);.  for(i=n
caf0: 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70  ameLen; i>0 && p
cb00: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
cb10: 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d  y[i-1]!='/'; i--
cb20: 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20  ){}.  if( i>0 ) 
cb30: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
cb40: 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73  ry[i-1] = 0;.  s
cb50: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  trcpy(pPager->zJ
cb60: 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74  ournal, zFullPat
cb70: 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  hname);.  sqlite
cb80: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
cb90: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70  me);.  strcpy(&p
cba0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
cbb0: 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72  nameLen], "-jour
cbc0: 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d  nal");.  pPager-
cbd0: 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 50 61 67  >fd = fd;.  pPag
cbe0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
cbf0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75  = 0;.  pPager->u
cc00: 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a  seJournal = useJ
cc10: 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62  ournal && !memDb
cc20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
cc30: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
cc40: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
cc50: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
cc60: 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
cc70: 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
cc80: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
cc90: 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 50  eSize = SQLITE_P
cca0: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67  AGE_SIZE;.  pPag
ccb0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
ccc0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
ccd0: 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  JSize = 0;.  pPa
cce0: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
ccf0: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
cd00: 20 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78   = mxPage>5 ? mx
cd10: 50 61 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61  Page : 10;.  pPa
cd20: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
cd30: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  ER_UNLOCK;.  pPa
cd40: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
cd50: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  ;.  pPager->temp
cd60: 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
cd70: 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
cd80: 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67   = memDb;.  pPag
cd90: 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72  er->readOnly = r
cda0: 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65  eadOnly;.  pPage
cdb0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
cdc0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
cdd0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
cde0: 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
cdf0: 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  nal;.  pPager->f
ce00: 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65  ullSync = (pPage
ce10: 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a  r->noSync?0:1);.
ce20: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
ce30: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
ce40: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
ce50: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
ce60: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
ce70: 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61  >nExtra = nExtra
ce80: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74  ;.  pPager->sect
ce90: 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53  orSize = PAGER_S
cea0: 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 70 50  ECTOR_SIZE;.  pP
ceb0: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
cec0: 65 72 20 3d 20 28 42 75 73 79 48 61 6e 64 6c 65  er = (BusyHandle
ced0: 72 20 2a 29 70 42 75 73 79 48 61 6e 64 6c 65 72  r *)pBusyHandler
cee0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
cef0: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
cf00: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
cf10: 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20  h));.  *ppPager 
cf20: 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
cf30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
cf40: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  ./*.** Set the d
cf50: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
cf60: 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f  is pager.  If no
cf70: 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74  t NULL, the dest
cf80: 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64  ructor is called
cf90: 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66  .** when the ref
cfa0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
cfb0: 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65  each page reache
cfc0: 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73  s zero.  The des
cfd0: 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62  tructor can.** b
cfe0: 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20  e used to clean 
cff0: 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  up information i
d000: 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d  n the extra segm
d010: 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ent appended to 
d020: 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  each page..**.**
d030: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
d040: 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73  is not called as
d050: 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65   a result sqlite
d060: 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20  3pager_close(). 
d070: 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73   .** Destructors
d080: 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64   are only called
d090: 20 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72   by sqlite3pager
d0a0: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69  _unref()..*/.voi
d0b0: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
d0c0: 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61  et_destructor(Pa
d0d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
d0e0: 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a  d (*xDesc)(void*
d0f0: 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
d100: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->xDestructor = 
d110: 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xDesc;.}../*.** 
d120: 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61  Set the reinitia
d130: 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70  lizer for this p
d140: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
d150: 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
d160: 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
d170: 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
d180: 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
d190: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
d1a0: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
d1b0: 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61  al.** value as a
d1c0: 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c   result of a rol
d1d0: 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c  lback.  The call
d1e0: 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65  back gives highe
d1f0: 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20  r-level code.** 
d200: 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
d210: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
d220: 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61  TRA section to a
d230: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
d240: 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64  stored.** page d
d250: 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ata..*/.void sql
d260: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65  ite3pager_set_re
d270: 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50  initer(Pager *pP
d280: 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65  ager, void (*xRe
d290: 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29  init)(void*,int)
d2a0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  ){.  pPager->xRe
d2b0: 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
d2c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
d2d0: 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
d2e0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
d2f0: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
d300: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
d310: 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  pPager..*/.int s
d320: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
d330: 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
d340: 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b  ger){.  off_t n;
d350: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d360: 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
d370: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
d380: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
d390: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
d3a0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  }.  if( sqlite3O
d3b0: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
d3c0: 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49  r->fd, &n)!=SQLI
d3d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
d3e0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
d3f0: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a  PAGER_ERR_DISK;.
d400: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d410: 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f  }.  n /= SQLITE_
d420: 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28  PAGE_SIZE;.  if(
d430: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
d440: 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  && n==PENDING_BY
d450: 54 45 2f 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  TE/SQLITE_PAGE_S
d460: 49 5a 45 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a  IZE ){.    n++;.
d470: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
d480: 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
d490: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61  NLOCK ){.    pPa
d4a0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
d4b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
d4c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
d4d0: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
d4e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
d4f0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
d500: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  .../*.** Unlink 
d510: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
d520: 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
d530: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
d540: 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
d550: 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
d560: 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
d570: 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
d580: 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
d590: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
d5a0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
d5b0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
d5c0: 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73  * Keep the pFirs
d5d0: 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20  tSynced pointer 
d5e0: 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
d5f0: 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a  first synchroniz
d600: 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  ed page */.  if(
d610: 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46   pPg==pPager->pF
d620: 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
d630: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
d640: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
d650: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
d660: 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
d670: 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
d680: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
d690: 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
d6a0: 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  }..  /* Unlink f
d6b0: 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
d6c0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70   */.  if( pPg->p
d6d0: 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
d6e0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
d6f0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
d700: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65  >pNextFree;.  }e
d710: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
d720: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
d730: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
d740: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
d750: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
d760: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
d770: 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  tFree ){.    pPg
d780: 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
d790: 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
d7a0: 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  revFree;.  }else
d7b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
d7c0: 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
d7d0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
d7e0: 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
d7f0: 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50  evFree;.  }.  pP
d800: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  g->pNextFree = p
d810: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
d820: 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  0;..  /* Unlink 
d830: 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
d840: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66  sh table */.  if
d850: 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
d860: 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
d870: 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
d880: 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
d890: 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  sh;.  }.  if( pP
d8a0: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a  g->pPrevHash ){.
d8b0: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
d8c0: 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  sh->pNextHash = 
d8d0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
d8e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
d8f0: 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
d900: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
d910: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d920: 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b  aHash[h]==pPg );
d930: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
d940: 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65  sh[h] = pPg->pNe
d950: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50  xtHash;.  }.  pP
d960: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
d970: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
d980: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
d990: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
d9a0: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20   to truncate an 
d9b0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
d9c0: 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61  se.  Delete.** a
d9d0: 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
d9e0: 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68  gno is larger th
d9f0: 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
da00: 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
da10: 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65  enced..** Refere
da20: 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
da30: 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
da40: 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
da50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
da60: 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
da70: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
da80: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
da90: 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20  PgHdr **ppPg;.  
daa0: 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61  int dbSize = pPa
dab0: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
dac0: 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e  ppPg = &pPager->
dad0: 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  pAll;.  while( (
dae0: 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20  pPg = *ppPg)!=0 
daf0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
db00: 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a  pgno<=dbSize ){.
db10: 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
db20: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
db30: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e   }else if( pPg->
db40: 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRef>0 ){.      
db50: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
db60: 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
db70: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
db80: 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
db90: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
dba0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
dbb0: 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78  ppPg = pPg->pNex
dbc0: 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69  tAll;.      unli
dbd0: 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
dbe0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
dbf0: 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
dc00: 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
dc10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
dc20: 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
dc30: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
dc40: 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
dc50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
dc60: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
dc70: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
dc80: 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
dc90: 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
dca0: 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 7b 0a 20  r->dbSize<0 ){. 
dcb0: 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
dcc0: 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
dcd0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
dce0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
dcf0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
dd00: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
dd10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
dd20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
dd30: 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61  e>=(unsigned)pPa
dd40: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
dd50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dd60: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
dd70: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
dd80: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
dd90: 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
dda0: 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
ddb0: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
ddc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ddd0: 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  }.  rc = syncJou
dde0: 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
ddf0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
de00: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
de10: 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rc;.  }.  rc = s
de20: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
de30: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  (&pPager->fd, SQ
de40: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28  LITE_PAGE_SIZE*(
de50: 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a 20 20  off_t)nPage);.  
de60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
de70: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
de80: 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
de90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
dea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
deb0: 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
dec0: 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
ded0: 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
dee0: 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
def0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
df00: 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
df10: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
df20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
df30: 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
df40: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
df50: 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
df60: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
df70: 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
df80: 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
df90: 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
dfa0: 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
dfb0: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
dfc0: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
dfd0: 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
dfe0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
dff0: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
e000: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
e010: 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dump..*/.int sql
e020: 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
e030: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
e040: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
e050: 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Next;.  switch( 
e060: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b  pPager->state ){
e070: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
e080: 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61  RESERVED:.    ca
e090: 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3a  se PAGER_SYNCED:
e0a0: 20 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52   .    case PAGER
e0b0: 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20  _EXCLUSIVE: {.  
e0c0: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
e0d0: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
e0e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
e0f0: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
e100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
e110: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
e120: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
e130: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
e140: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
e150: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
e160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e170: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
e180: 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  SHARED: {.      
e190: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
e1a0: 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Db ){.        sq
e1b0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
e1c0: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
e1d0: 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
e1e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e1f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
e200: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
e210: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ng */.      brea
e220: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
e230: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
e240: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
e250: 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44  ext){.#ifndef ND
e260: 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 50 61  EBUG.    if( pPa
e270: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
e280: 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
e290: 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
e2a0: 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
e2b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e2c0: 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
e2d0: 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
e2e0: 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
e2f0: 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
e300: 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
e310: 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
e320: 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  dif.    pNext = 
e330: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
e340: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
e350: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
e360: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
e370: 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65 72 74 28  ->fd);.  assert(
e380: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e390: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20  Open==0 );.  /* 
e3a0: 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61  Temp files are a
e3b0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
e3c0: 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20  eted by the OS. 
e3d0: 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   ** if( pPager->
e3e0: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a  tempFile ){.  **
e3f0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
e400: 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
e410: 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20  name);.  ** }.  
e420: 2a 2f 0a 20 20 43 4c 52 5f 50 41 47 45 52 28 70  */.  CLR_PAGER(p
e430: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
e440: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21  ager->zFilename!
e450: 3d 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b  =(char*)&pPager[
e460: 31 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  1] ){.    assert
e470: 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  ( 0 );  /* Canno
e480: 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  t happen */.    
e490: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
e4a0: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
e4b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
e4c0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
e4d0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e4e0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e4f0: 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ry);.  }.  sqlit
e500: 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
e510: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e520: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
e530: 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
e540: 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
e550: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
e560: 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  gno sqlite3pager
e570: 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64  _pagenumber(void
e580: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
e590: 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50  r *p = DATA_TO_P
e5a0: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72  GHDR(pData);.  r
e5b0: 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d  eturn p->pgno;.}
e5c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
e5d0: 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  _ref() function 
e5e0: 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72  increments the r
e5f0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
e600: 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66  or a page..** If
e610: 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72   the page is cur
e620: 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
e630: 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65  eelist (the refe
e640: 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
e650: 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d  ero) then.** rem
e660: 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ove it from the 
e670: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
e680: 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73  For non-test sys
e690: 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
e6a0: 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74   is a macro that
e6b0: 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66   calls _page_ref
e6c0: 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20  ().** online of 
e6d0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
e6e0: 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f  unt is zero.  Fo
e6f0: 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  r test systems, 
e700: 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73  page_ref().** is
e710: 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
e720: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
e730: 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20  set breakpoints 
e740: 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f  and trace it..*/
e750: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61  .static void _pa
e760: 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
e770: 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
e780: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
e790: 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
e7a0: 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
e7b0: 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
e7c0: 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
e7d0: 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  Pg==pPg->pPager-
e7e0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
e7f0: 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20  .      PgHdr *p 
e800: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
e810: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
e820: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
e830: 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
e840: 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67  ree; }.      pPg
e850: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
e860: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
e870: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
e880: 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
e890: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
e8a0: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
e8b0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
e8c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
e8d0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
e8e0: 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
e8f0: 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ree;.    }.    i
e900: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
e910: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
e920: 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
e930: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
e940: 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  vFree;.    }else
e950: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
e960: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
e970: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
e980: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67   }.    pPg->pPag
e990: 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
e9a0: 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
e9b0: 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d   REFINFO(pPg);.}
e9c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
e9d0: 45 53 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69  EST.  static voi
e9e0: 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72  d page_ref(PgHdr
e9f0: 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20   *pPg){.    if( 
ea00: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
ea10: 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28        _page_ref(
ea20: 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
ea30: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  .      pPg->nRef
ea40: 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46  ++;.      REFINF
ea50: 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  O(pPg);.    }.  
ea60: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
ea70: 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28   page_ref(P)   (
ea80: 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61  (P)->nRef==0?_pa
ea90: 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29  ge_ref(P):(void)
eaa0: 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e  (P)->nRef++).#en
eab0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
eac0: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
ead0: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
eae0: 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
eaf0: 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
eb00: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
eb10: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
eb20: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
eb30: 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
eb40: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
eb50: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
eb60: 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65  Data);.  page_re
eb70: 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
eb80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
eb90: 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
eba0: 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72  urnal.  In other
ebb0: 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
ebc0: 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
ebd0: 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
ebe0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
ebf0: 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
ec00: 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
ec10: 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
ec20: 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69  e.** disk.  It i
ec30: 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f  s not safe to mo
ec40: 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61  dify the origina
ec50: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
ec60: 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74  until after.** t
ec70: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
ec80: 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20  een synced.  If 
ec90: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
eca0: 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65  abase is modifie
ecb0: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
ecc0: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
ecd0: 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61  d and a power fa
ece0: 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68  ilure occurs, th
ecf0: 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e  e unsynced journ
ed00: 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64  al.** data would
ed10: 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20   be lost and we 
ed20: 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20  would be unable 
ed30: 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f  to completely ro
ed40: 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61  llback the.** da
ed50: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
ed60: 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
ed70: 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72  tion would occur
ed80: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
ed90: 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74  utine also updat
eda0: 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  es the nRec fiel
edb0: 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  d in the header 
edc0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
edd0: 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ** (See comments
ede0: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c   on the pager_pl
edf0: 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
ee00: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
ee10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a  information.).**
ee20: 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64   If the sync mod
ee30: 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73  e is FULL, two s
ee40: 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e  yncs will occur.
ee50: 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c    First the whol
ee60: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20  e journal.** is 
ee70: 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65  synced, then the
ee80: 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
ee90: 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73  pdated, then a s
eea0: 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72  econd sync occur
eeb0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
eec0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
eed0: 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  , we do not care
eee0: 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
eef0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61  to rollback.** a
ef00: 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  fter a power fai
ef10: 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63  lure, so sync oc
ef20: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  curs..**.** This
ef30: 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
ef40: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
ef50: 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
ef60: 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
ef70: 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
ef80: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
ef90: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
efa0: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
efb0: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
efc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
efd0: 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
efe0: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
eff0: 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
f000: 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69  ase.  ** (assumi
f010: 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f  ng there is a jo
f020: 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65  urnal and it nee
f030: 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e  ds to be synced.
f040: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
f050: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
f060: 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
f070: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
f080: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f090: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
f0a0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  );.      /* asse
f0b0: 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  rt( !pPager->noS
f0c0: 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63  ync ); // noSync
f0d0: 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66   might be set if
f0e0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20   synchronous.   
f0f0: 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64     ** was turned
f100: 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74   off after the t
f110: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
f120: 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20  tarted.  Ticket 
f130: 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20  #615 */.#ifndef 
f140: 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20  NDEBUG.      {. 
f150: 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
f160: 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e  ure the pPager->
f170: 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20  nRec counter we 
f180: 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65  are keeping agre
f190: 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  es.        ** wi
f1a0: 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70  th the nRec comp
f1b0: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69  uted from the si
f1c0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
f1d0: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
f1e0: 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  */.        off_t
f1f0: 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63   jSz;.        rc
f200: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
f210: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
f220: 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20  d, &jSz);.      
f230: 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
f240: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
f250: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f260: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a  >journalOff==jSz
f270: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
f280: 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
f290: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
f2a0: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
f2b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f2c0: 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
f2d0: 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
f2e0: 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
f2f0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
f300: 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
f310: 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
f320: 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
f330: 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
f340: 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
f350: 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
f360: 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
f370: 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
f380: 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
f390: 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
f3a0: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
f3b0: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
f3c0: 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53         TRACE2("S
f3d0: 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
f3e0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
f3f0: 2e 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  .h);.          r
f400: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
f410: 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  c(&pPager->jfd);
f420: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
f430: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
f440: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f450: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
f460: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
f470: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f480: 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
f490: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
f4a0: 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
f4b0: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
f4c0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  fd, pPager->nRec
f4d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
f4e0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
f4f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
f500: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
f510: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
f520: 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d  nalOff);.      }
f530: 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53  .      TRACE2("S
f540: 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
f550: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
f560: 2e 68 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  .h);.      rc = 
f570: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
f580: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
f590: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
f5a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
f5b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
f5c0: 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
f5d0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
f5e0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
f5f0: 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65   /* Erase the ne
f600: 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d  edSync flag from
f610: 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20   every page..   
f620: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   */.    for(pPg=
f630: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
f640: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
f650: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
f660: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
f670: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
f680: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
f690: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
f6a0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
f6b0: 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
f6c0: 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
f6d0: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
f6e0: 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
f6f0: 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
f700: 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
f710: 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
f720: 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
f730: 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
f740: 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
f750: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72  .  else{.    for
f760: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
f770: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
f780: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
f790: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
f7a0: 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
f7b0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
f7c0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
f7d0: 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46  nced==pPager->pF
f7e0: 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  irst );.  }.#end
f7f0: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
f800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
f810: 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  a list of pages 
f820: 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68  (connected by th
f830: 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
f840: 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a  ointer) write.**
f850: 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68   every one of th
f860: 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f  ose pages out to
f870: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f880: 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d  le and mark them
f890: 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e   all.** as clean
f8a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f8b0: 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
f8c0: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
f8d0: 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
f8e0: 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ger;.  int rc;. 
f8f0: 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 0a   int busy = 1;..
f900: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f910: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f920: 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
f930: 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
f940: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
f950: 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
f960: 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
f970: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
f980: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
f990: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
f9a0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
f9b0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
f9c0: 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
f9d0: 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  g.  ** calls to 
f9e0: 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
f9f0: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a  are no-ops..  **
fa00: 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
fa10: 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
fa20: 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
fa30: 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
fa40: 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
fa50: 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
fa60: 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
fa70: 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
fa80: 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
fa90: 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
faa0: 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
fab0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
fac0: 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
fad0: 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
fae0: 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
faf0: 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
fb00: 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
fb10: 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
fb20: 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
fb30: 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
fb40: 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
fb50: 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
fb60: 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
fb70: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
fb80: 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
fb90: 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
fba0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
fbb0: 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
fbc0: 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
fbd0: 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
fbe0: 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
fbf0: 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
fc00: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
fc10: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
fc20: 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
fc30: 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
fc40: 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
fc50: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
fc60: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
fc70: 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
fc80: 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
fc90: 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
fca0: 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
fcb0: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
fcc0: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
fcd0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
fce0: 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  USIVE_LOCK);.  }
fcf0: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
fd00: 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20 20 20  E_BUSY && .     
fd10: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
fd20: 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20  ndler && .      
fd30: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
fd40: 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a  dler->xFunc && .
fd50: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
fd60: 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e  usyHandler->xFun
fd70: 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  c(pPager->pBusyH
fd80: 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75  andler->pArg, bu
fd90: 73 79 2b 2b 29 0a 20 20 29 3b 0a 20 20 69 66 28  sy++).  );.  if(
fda0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fdb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
fdc0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
fdd0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
fde0: 4c 55 53 49 56 45 3b 0a 0a 20 20 77 68 69 6c 65  LUSIVE;..  while
fdf0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61  ( pList ){.    a
fe00: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
fe10: 72 74 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  rty );.    sqlit
fe20: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
fe30: 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67  ->fd, (pList->pg
fe40: 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
fe50: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
fe60: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
fe70: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
fe80: 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
fe90: 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 54 52 41  gno, 6);.    TRA
fea0: 43 45 32 28 22 53 54 4f 52 45 20 70 61 67 65 20  CE2("STORE page 
feb0: 25 64 5c 6e 22 2c 20 70 4c 69 73 74 2d 3e 70 67  %d\n", pList->pg
fec0: 6e 6f 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  no);.    rc = sq
fed0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
fee0: 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
fef0: 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
ff00: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
ff10: 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61  );.    CODEC(pPa
ff20: 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
ff30: 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
ff40: 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
ff50: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ff60: 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
ff70: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c  irty = 0;.    pL
ff80: 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
ff90: 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
ffa0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ffb0: 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
ffc0: 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
ffd0: 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
ffe0: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
fff0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10000 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
10010 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
10020 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
10030 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
10040 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
10050 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
10060 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
10070 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
10080 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
10090 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70   *p, *pList;.  p
100a0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
100b0 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
100c0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
100d0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69  ){.    if( p->di
100e0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  rty ){.      p->
100f0 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a  pDirty = pList;.
10100 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b        pList = p;
10110 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10120 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
10130 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
10140 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
10150 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
10160 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
10170 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
10180 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
10190 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
101a0 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
101b0 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
101c0 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
101d0 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77  ..**.** A _get w
101e0 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
101f0 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
10200 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
10210 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
10220 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
10230 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
10240 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
10250 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
10260 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
10270 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
10280 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
10290 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
102a0 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
102b0 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
102c0 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
102d0 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
102e0 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
102f0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
10300 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
10310 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
10320 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
10330 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
10340 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
10350 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
10360 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
10370 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
10380 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
10390 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
103a0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
103b0 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65  also sqlite3page
103c0 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  r_lookup().  Bot
103d0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
103e0 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74  nd _lookup() att
103f0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
10400 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
10410 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
10420 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
10430 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
10440 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
10450 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
10460 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
10470 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f   it in whereas _
10480 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  lookup().** just
10490 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
104a0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
104b0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
104c0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
104d0 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
104e0 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
104f0 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
10500 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
10510 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
10520 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e  ince _lookup() n
10530 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
10540 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
10550 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
10560 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
10570 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
10580 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
10590 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
105a0 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
105b0 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64  *ppPage){.  PgHd
105c0 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
105d0 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
105e0 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
105f0 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
10600 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
10610 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
10620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
10630 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  no!=0 );.  *ppPa
10640 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
10650 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
10660 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
10670 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
10680 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
10690 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
106a0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
106b0 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
106c0 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
106d0 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
106e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
106f0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
10700 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
10710 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65  0 && !pPager->me
10720 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  mDb ){.    int b
10730 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f 20  usy = 1;.    do 
10740 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
10750 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
10760 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
10770 4f 43 4b 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  OCK);.    }while
10780 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
10790 59 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  Y && .        pP
107a0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
107b0 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  er && .        p
107c0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
107d0 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20  ler->xFunc && . 
107e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
107f0 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75  BusyHandler->xFu
10800 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  nc(pPager->pBusy
10810 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62  Handler->pArg, b
10820 75 73 79 2b 2b 29 0a 20 20 20 20 29 3b 0a 20 20  usy++).    );.  
10830 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10840 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
10850 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
10860 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
10870 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
10880 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
10890 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
108a0 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
108b0 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
108c0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
108d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
108e0 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
108f0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
10900 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
10910 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
10920 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
10930 6c 20 26 26 20 0a 20 20 20 20 20 20 20 20 73 71  l && .        sq
10940 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
10950 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
10960 61 6c 29 20 26 26 0a 20 20 20 20 20 20 20 20 21  al) &&.        !
10970 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
10980 73 65 72 76 65 64 4c 6f 63 6b 28 26 70 50 61 67  servedLock(&pPag
10990 65 72 2d 3e 66 64 29 20 0a 20 20 20 20 29 7b 0a  er->fd) .    ){.
109a0 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a         int rc;..
109b0 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e         /* Get an
109c0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
109d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
109e0 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
109f0 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
10a00 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
10a10 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
10a20 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
10a30 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
10a40 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45   the.       ** E
10a50 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
10a60 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
10a70 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
10a80 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
10a90 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
10aa0 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
10ab0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
10ac0 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
10ad0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74  he.       ** dat
10ae0 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
10af0 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
10b00 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
10b10 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
10b20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
10b30 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
10b40 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
10b50 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
10b60 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
10b70 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
10b80 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64         ** second
10b90 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65   process will ge
10ba0 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20  t to this point 
10bb0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
10bc0 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a  fail to.       *
10bd0 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77  * obtain it's ow
10be0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
10bf0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
10c00 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f   file..       */
10c10 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .       rc = sql
10c20 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
10c30 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
10c40 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
10c50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10c60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71  K ){.         sq
10c70 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
10c80 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
10c90 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50  CK);.         pP
10ca0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
10cb0 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  GER_UNLOCK;.    
10cc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10ce0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
10cf0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
10d00 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ..       /* Open
10d10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
10d20 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20   reading only.  
10d30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  Return SQLITE_BU
10d40 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20  SY if.       ** 
10d50 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
10d60 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
10d70 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20  l file. .       
10d80 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65  **.       ** The
10d90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
10da0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
10db0 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e  e locked itself.
10dc0 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20    The.       ** 
10dd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
10de0 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73  never open unles
10df0 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
10e00 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20  ase file holds. 
10e10 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65        ** a write
10e20 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20   lock, so there 
10e30 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61  is never any cha
10e40 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  nce of two or mo
10e50 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  re.       ** pro
10e60 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74  cesses opening t
10e70 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68  he journal at th
10e80 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20  e same time..   
10e90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
10ea0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
10eb0 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d  ReadOnly(pPager-
10ec0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67  >zJournal, &pPag
10ed0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
10ee0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ef0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73  OK ){.         s
10f00 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
10f10 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
10f20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70  OCK);.         p
10f30 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
10f40 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
10f50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10f60 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
10f70 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72   }.       pPager
10f80 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
10f90 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  1;.       pPager
10fa0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
10fb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61   = 0;.       pPa
10fc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10fd0 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 0;.       pPag
10fe0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10ff0 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  0;.       pPager
11000 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
11010 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61  ;..       /* Pla
11020 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
11030 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
11040 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
11050 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a   write.       **
11060 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
11070 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
11080 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  k..       */.   
11090 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
110a0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
110b0 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
110c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
110d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
110e0 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  .       }.    }.
110f0 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d      pPg = 0;.  }
11100 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61  else{.    /* Sea
11110 72 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20  rch for page in 
11120 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67  cache */.    pPg
11130 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
11140 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
11150 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
11160 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e  emDb && pPager->
11170 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
11180 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
11190 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
111a0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
111b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
111c0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
111d0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
111e0 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67  s not in the pag
111f0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
11200 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65  int h;.    pPage
11210 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20  r->nMiss++;.    
11220 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
11230 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
11240 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72   || pPager->pFir
11250 73 74 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  st==0 || pPager-
11260 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
11270 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
11280 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50  page */.      pP
11290 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
112a0 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67  Raw( sizeof(*pPg
112b0 29 20 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ) + SQLITE_PAGE_
112c0 53 49 5a 45 20 0a 20 20 20 20 20 20 20 20 20 20  SIZE .          
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
112f0 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
11300 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 2b 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62   + pPager->memDb
11330 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72  *sizeof(PgHistor
11340 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y) );.      if( 
11350 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
11360 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
11370 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emDb ){.        
11380 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c    pager_unwritel
11390 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
113a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
113b0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
113c0 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b  = PAGER_ERR_MEM;
113d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
113e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
113f0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
11400 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f  et(pPg, 0, sizeo
11410 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20  f(*pPg));.      
11420 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
11430 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  b ){.        mem
11440 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  set(PGHDR_TO_HIS
11450 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20  T(pPg, pPager), 
11460 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74  0, sizeof(PgHist
11470 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ory));.      }. 
11480 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
11490 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20   = pPager;.     
114a0 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d   pPg->pNextAll =
114b0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20   pPager->pAll;. 
114c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c       pPager->pAl
114d0 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70  l = pPg;.      p
114e0 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  Pager->nPage++;.
114f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11500 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20   /* Find a page 
11510 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79  to recycle.  Try
11520 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67   to locate a pag
11530 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  e that does not.
11540 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65        ** require
11550 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
11560 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
11570 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nal..      */.  
11580 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72      pPg = pPager
11590 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a  ->pFirstSynced;.
115a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20  .      /* If we 
115b0 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
115c0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
115d0 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66  not require an f
115e0 73 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20  sync().      ** 
115f0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
11600 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
11610 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
11620 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 20 20    This is a.    
11630 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f    ** very slow o
11640 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20  peration, so we 
11650 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f  work hard to avo
11660 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65  id it.  But some
11670 74 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69  times.      ** i
11680 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65  t can't be helpe
11690 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
116a0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
116b0 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
116c0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
116d0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
116e0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
116f0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
11700 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
11710 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
11720 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
11730 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
11740 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
11750 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
11760 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20         /* If in 
11770 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
11780 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
11790 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
117a0 74 68 65 0a 09 20 20 2a 2a 20 6a 6f 75 72 6e 61  the..  ** journa
117b0 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  l file. This is 
117c0 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76  done to avoid ev
117d0 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a  er modifying a j
117e0 6f 75 72 6e 61 6c 0a 09 20 20 2a 2a 20 68 65 61  ournal..  ** hea
117f0 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f  der that is invo
11800 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  lved in the roll
11810 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68  back of pages th
11820 61 74 20 68 61 76 65 0a 09 20 20 2a 2a 20 61 6c  at have..  ** al
11830 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
11840 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
11850 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
11860 68 65 61 64 65 72 20 69 73 0a 09 20 20 2a 2a 20  header is..  ** 
11870 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65  trashed when the
11880 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
11890 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 20  pdated)..       
118a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
118b0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
118c0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
118d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
118e0 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20  nalOff > 0 );.  
118f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
11900 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
11910 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
11920 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
11930 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11940 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
11950 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
11960 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11970 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
11980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
11990 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61         pPg = pPa
119a0 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20  ger->pFirst;.   
119b0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
119c0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  t( pPg->nRef==0 
119d0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  );..      /* Wri
119e0 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  te the page to t
119f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11a00 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e   if it is dirty.
11a10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11a20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
11a30 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
11a40 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
11a50 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
11a60 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
11a70 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
11a80 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
11a90 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ( pPg );.       
11aa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11ab0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11ac0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
11ad0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
11ae0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11af0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
11b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
11b20 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
11b30 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
11b40 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
11b50 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
11b60 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
11b70 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  k, then.      **
11b80 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20   set the global 
11b90 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
11ba0 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c  lag, thus disabl
11bb0 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ing the.      **
11bc0 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c   sqlite_dont_rol
11bd0 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61  lback() optimiza
11be0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73  tion for the res
11bf0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
11c00 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  ction..      ** 
11c10 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  It is necessary 
11c20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75  to do this becau
11c30 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b  se the page mark
11c40 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
11c50 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74  k.      ** might
11c60 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
11c70 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
11c80 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
11c90 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
11ca0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69  .      ** that i
11cb0 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77  s was marked alw
11cc0 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  aysRollback.  Th
11cd0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c  is means that al
11ce0 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20  l pages must.   
11cf0 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
11d00 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
11d10 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f  k from here on o
11d20 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ut..      */.   
11d30 20 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61     if( pPg->alwa
11d40 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
11d50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c        pPager->al
11d60 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
11d70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
11d80 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f   /* Unlink the o
11d90 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ld page from the
11da0 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74   free list and t
11db0 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20  he hash table.  
11dc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c      */.      unl
11dd0 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
11de0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66      pPager->nOvf
11df0 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  l++;.    }.    p
11e00 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
11e10 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
11e20 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  >aInJournal && (
11e30 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
11e40 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
11e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
11e60 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  ckMemory(pPager-
11e70 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >aInJournal, pgn
11e80 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65  o/8);.      asse
11e90 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
11ea0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
11eb0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
11ec0 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  = (pPager->aInJo
11ed0 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
11ee0 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
11ef0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
11f00 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
11f10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
11f20 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
11f30 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
11f40 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
11f50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
11f60 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  aInStmt && (int)
11f70 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
11f80 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  mtSize.         
11f90 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e      && (pPager->
11fa0 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20  aInStmt[pgno/8] 
11fb0 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
11fc0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67  !=0 ){.      pag
11fd0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
11fe0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  st(pPg);.    }el
11ff0 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72  se{.      page_r
12000 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f  emove_from_stmt_
12010 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
12020 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
12030 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  = 0;.    pPg->nR
12040 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49  ef = 1;.    REFI
12050 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50  NFO(pPg);.    pP
12060 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
12070 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68    h = pager_hash
12080 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d  (pgno);.    pPg-
12090 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
120a0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
120b0 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
120c0 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  [h] = pPg;.    i
120d0 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
120e0 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
120f0 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
12100 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  h->pPrevHash==0 
12110 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  );.      pPg->pN
12120 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
12130 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
12140 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
12150 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
12160 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
12170 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c  O_EXTRA(pPg), 0,
12180 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
12190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
121a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
121b0 20 29 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   ) sqlite3pager_
121c0 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
121d0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
121e0 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
121f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61  .      sqlite3pa
12200 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f  ger_unref(PGHDR_
12210 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20  TO_DATA(pPg));. 
12220 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
12230 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
12240 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
12250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12260 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
12270 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20  int)pgno ){.    
12280 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
12290 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
122a0 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
122b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
122c0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
122d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
122e0 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20  ->memDb==0 );.  
122f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
12300 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
12310 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53  pgno-1)*(off_t)S
12320 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
12330 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12340 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67  ite3OsRead(&pPag
12350 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
12360 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49  _DATA(pPg), SQLI
12370 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
12380 20 20 20 20 20 54 52 41 43 45 32 28 22 46 45 54       TRACE2("FET
12390 43 48 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  CH page %d\n", p
123a0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
123b0 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50   CODEC(pPager, P
123c0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
123d0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
123e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
123f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12400 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53       off_t fileS
12410 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
12420 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
12430 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26  ze(&pPager->fd,&
12440 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54  fileSize)!=SQLIT
12450 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
12460 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e      || fileSize>
12470 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47  =pgno*SQLITE_PAG
12480 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
12490 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
124a0 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f  _unref(PGHDR_TO_
124b0 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20  DATA(pPg));.    
124c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
124d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
124e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
124f0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
12500 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50  Pg), 0, SQLITE_P
12510 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
12520 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12530 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
12540 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
12550 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
12560 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
12570 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b     pPager->nHit+
12580 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28  +;.    page_ref(
12590 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
125a0 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  age = PGHDR_TO_D
125b0 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ATA(pPg);.  retu
125c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
125d0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
125e0 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
125f0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
12600 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
12610 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
12620 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
12630 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
12640 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
12650 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
12660 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
12670 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
12680 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67   also sqlite3pag
12690 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64  er_get().  The d
126a0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
126b0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
126c0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67  * and sqlite3pag
126d0 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61 74  er_get() is that
126e0 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
126f0 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
12700 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
12710 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
12720 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
12730 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
12740 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
12750 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
12760 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
12770 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
12780 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
12790 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
127a0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
127b0 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  3pager_lookup(Pa
127c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
127d0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
127e0 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
127f0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
12800 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
12810 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
12820 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
12830 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
12840 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12850 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
12860 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
12870 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
12880 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
12890 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
128a0 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
128b0 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
128c0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
128d0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
128e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
128f0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
12900 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
12910 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
12920 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
12930 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
12940 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
12950 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
12960 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
12970 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
12980 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
12990 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
129a0 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
129b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
129c0 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70  er_unref(void *p
129d0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
129e0 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65  pPg;..  /* Decre
129f0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
12a00 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  ce count for thi
12a10 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50  s page.  */.  pP
12a20 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
12a30 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  R(pData);.  asse
12a40 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
12a50 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
12a60 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
12a70 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
12a80 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
12a90 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
12aa0 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
12ab0 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
12ac0 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
12ad0 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
12ae0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
12af0 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
12b00 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
12b10 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
12b20 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
12b30 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
12b40 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
12b50 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
12b60 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
12b70 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
12b80 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
12b90 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
12ba0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
12bb0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
12bc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12bd0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
12be0 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
12bf0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
12c00 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
12c10 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
12c20 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
12c30 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
12c40 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
12c50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
12c60 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
12c70 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
12c80 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50  ructor(pData, pP
12c90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
12ca0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
12cb0 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   When all pages 
12cc0 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69  reach the freeli
12cd0 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61  st, drop the rea
12ce0 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20  d lock from.    
12cf0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
12d00 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
12d10 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b   pPager->nRef--;
12d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12d30 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a  ger->nRef>=0 );.
12d40 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
12d50 6e 52 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67  nRef==0 && !pPag
12d60 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
12d70 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
12d80 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
12d90 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
12da0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
12db0 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
12dc0 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
12dd0 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
12de0 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
12df0 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
12e00 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
12e10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
12e20 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
12e30 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
12e40 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
12e50 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
12e60 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
12e70 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
12e80 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
12e90 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
12ea0 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
12eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12ec0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
12ed0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
12ee0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
12ef0 74 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  t( !pPager->memD
12f00 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
12f10 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
12f20 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
12f30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12f40 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
12f50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12f60 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
12f70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67   );.  sqlite3pag
12f80 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
12f90 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
12fa0 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  aInJournal = sql
12fb0 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
12fc0 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
12fd0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
12fe0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
12ff0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55  {.    sqlite3OsU
13000 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
13010 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
13020 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
13030 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
13040 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
13050 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
13060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13070 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50  OpenExclusive(pP
13080 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13090 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61  &pPager->jfd,pPa
130a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
130b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
130c0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
130d0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
130e0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
130f0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69  rnalHdr = 0;.  i
13100 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13110 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
13120 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
13130 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
13140 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
13150 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   0;.    sqlite3O
13160 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
13170 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
13180 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
13190 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
131a0 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
131b0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
131c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
131d0 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50  OpenDirectory(pP
131e0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
131f0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
13200 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
13210 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50  alOpen = 1;.  pP
13220 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
13230 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  rted = 0;.  pPag
13240 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
13250 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61  ;.  pPager->alwa
13260 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
13270 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
13280 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
13290 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
132a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
132b0 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
132c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
132d0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
132e0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
132f0 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
13300 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
13310 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
13320 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75  ( pPager->stmtAu
13330 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51  toopen && rc==SQ
13340 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
13350 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
13360 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61 67  _stmt_begin(pPag
13370 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
13380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13390 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
133a0 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
133b0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
133c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
133d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
133e0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ULL;.    }.  }. 
133f0 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
13400 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
13410 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
13420 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
13430 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
13440 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
13450 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
13460 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
13470 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
13480 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63  er_commit() is c
13490 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
134a0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
134b0 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
134c0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
134d0 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69  3pager_close() i
134e0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
134f0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
13500 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
13510 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
13520 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
13530 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
13540 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
13550 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
13560 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
13570 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
13580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13590 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
135a0 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
135b0 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
135c0 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
135d0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
135e0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
135f0 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
13600 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
13610 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
13620 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
13630 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
13640 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
13650 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
13660 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
13670 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
13680 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
13690 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
136a0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
136b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
136c0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
136d0 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
136e0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
136f0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
13700 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
13710 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
13720 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
13730 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
13740 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
13750 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
13760 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
13770 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
13780 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
13790 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
137a0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
137b0 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
137c0 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
137d0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
137e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
137f0 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70  er_begin(void *p
13800 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
13810 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
13820 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
13830 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
13840 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
13850 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13860 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
13870 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
13880 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
13890 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
138a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
138b0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
138c0 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
138d0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
138e0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
138f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
13900 44 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  Db ){.      pPag
13910 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
13920 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
13930 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
13940 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
13950 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  dbSize;.    }els
13960 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 75 73  e{.      int bus
13970 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 6f 20  y = 1;.      do 
13980 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
13990 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
139a0 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
139b0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
139c0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
139d0 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20 20  TE_BUSY && .    
139e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
139f0 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a 20  usyHandler && . 
13a00 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
13a10 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78  >pBusyHandler->x
13a20 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20  Func && .       
13a30 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
13a40 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70  Handler->xFunc(p
13a50 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
13a60 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b  ler->pArg, busy+
13a70 2b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  +).      );.    
13a80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13a90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
13aa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13ab0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13ac0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
13ad0 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 70 50  SERVED;.      pP
13ae0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
13af0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
13b00 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E2("TRANSACTION 
13b10 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
13b20 64 2e 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20  d.h);.      if( 
13b30 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
13b40 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  al && !pPager->t
13b50 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
13b60 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
13b70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
13b80 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
13b90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
13ba0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
13bb0 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
13bc0 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20  writeable.  The 
13bd0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
13be0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
13bf0 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f   .** if it is no
13c00 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
13c10 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
13c20 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
13c30 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63  fore making.** c
13c40 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
13c50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
13c60 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
13c70 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
13c80 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73  he pager creates
13c90 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61   a new.** journa
13ca0 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  l and acquires a
13cb0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
13cc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
13cd0 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44   If the RESERVED
13ce0 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
13cf0 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
13d00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
13d10 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
13d20 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
13d30 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
13d40 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
13d50 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
13d60 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
13d70 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
13d80 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
13d90 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
13da0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
13db0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
13dc0 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
13dd0 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
13de0 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
13df0 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
13e00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
13e10 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
13e20 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
13e30 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
13e40 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
13e50 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
13e60 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
13e70 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
13e80 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
13e90 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ll to sqlite3pag
13ea0 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73  er_commit() or s
13eb0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
13ec0 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
13ed0 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  et..*/.int sqlit
13ee0 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f  e3pager_write(vo
13ef0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
13f00 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
13f10 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
13f20 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
13f30 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
13f40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13f50 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  E_OK;..  /* Chec
13f60 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a  k for errors.  *
13f70 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
13f80 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20  errMask ){ .    
13f90 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
13fa0 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
13fb0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
13fc0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
13fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
13fe0 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  RM;.  }..  asser
13ff0 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  t( !pPager->setM
14000 61 73 74 65 72 20 29 3b 0a 0a 20 20 2f 2a 20 4d  aster );..  /* M
14010 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
14020 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
14030 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
14040 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
14050 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
14060 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
14070 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
14080 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74    */.  pPg->dirt
14090 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  y = 1;.  if( pPg
140a0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
140b0 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70  pPg->inStmt || p
140c0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
140d0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67  ==0) ){.    pPag
140e0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
140f0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
14100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14110 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
14120 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
14130 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
14140 65 65 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20  eeds to be.  ** 
14150 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
14160 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
14170 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
14180 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  oint journal.  *
14190 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  * or both..  **.
141a0 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b    ** First check
141b0 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65   to see that the
141c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
141d0 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a  rnal exists and.
141e0 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69    ** create it i
141f0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  f it does not.. 
14200 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
14210 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
14220 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72  ER_UNLOCK );.  r
14230 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
14240 5f 62 65 67 69 6e 28 70 44 61 74 61 29 3b 0a 20  _begin(pData);. 
14250 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14260 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
14270 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
14280 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
14290 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
142a0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
142b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
142c0 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
142d0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  rnal ){.    rc =
142e0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
142f0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
14300 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14310 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
14320 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
14330 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
14340 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73  n || !pPager->us
14350 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50  eJournal );.  pP
14360 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
14370 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20   = 1;..  /* The 
14380 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
14390 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
143a0 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
143b0 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a 2a  ERVED or an.  **
143c0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
143d0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
143e0 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
143f0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
14400 67 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 74  ge to.  ** the t
14410 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
14420 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
14430 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
14440 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e   */.  if( !pPg->
14450 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
14460 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
14470 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44   || pPager->memD
14480 62 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69  b) ){.    if( (i
14490 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
144a0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
144b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ze ){.      int 
144c0 73 7a 50 67 3b 0a 20 20 20 20 20 20 75 33 32 20  szPg;.      u32 
144d0 73 61 76 65 64 3b 0a 20 20 20 20 20 20 69 66 28  saved;.      if(
144e0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
144f0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
14500 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
14510 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
14520 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
14530 20 54 52 41 43 45 32 28 22 4a 4f 55 52 4e 41 4c   TRACE2("JOURNAL
14540 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
14550 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
14560 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
14570 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20  pOrig==0 );.    
14580 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67      pHist->pOrig
14590 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
145a0 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
145b0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
145c0 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
145d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
145e0 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69  mcpy(pHist->pOri
145f0 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  g, PGHDR_TO_DATA
14600 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
14610 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
14620 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67 2d    }.        pPg-
14630 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
14640 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14650 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 20 3d       u32 cksum =
14660 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
14670 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
14680 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
14690 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 50  saved = *(u32*)P
146a0 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
146b0 67 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  g);.        stor
146c0 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70  e32bits(cksum, p
146d0 50 67 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  Pg, SQLITE_PAGE_
146e0 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 73  SIZE);.        s
146f0 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f 50 41 47  zPg = SQLITE_PAG
14700 45 5f 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20 20  E_SIZE+8;.      
14710 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50    store32bits(pP
14720 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34  g->pgno, pPg, -4
14730 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
14740 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
14750 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
14760 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14770 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
14780 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72  er->jfd, &((char
14790 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a  *)pData)[-4], sz
147a0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  Pg);.        pPa
147b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
147c0 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  += szPg;.       
147d0 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c   TRACE3("JOURNAL
147e0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
147f0 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  c=%d\n", pPg->pg
14800 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
14810 63 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  c);.        CODE
14820 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
14830 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a   pPg->pgno, 0);.
14840 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50          *(u32*)P
14850 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
14860 67 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20  g) = saved;.    
14870 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14890 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
148a0 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
148b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
148c0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
148d0 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20  AGER_ERR_FULL;. 
148e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
148f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
14900 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
14910 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
14920 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
14930 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
14940 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
14950 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
14960 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
14970 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
14980 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
14990 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
149a0 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 70 50 67  ync;.        pPg
149b0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
149c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
149d0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
149e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
149f0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
14a00 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
14a10 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
14a20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
14a30 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
14a40 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
14a50 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
14a60 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
14a70 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
14a80 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
14a90 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
14aa0 63 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  c;.      TRACE3(
14ab0 22 41 50 50 45 4e 44 20 70 61 67 65 20 25 64 20  "APPEND page %d 
14ac0 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 20  needSync=%d\n", 
14ad0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
14ae0 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d  needSync);.    }
14af0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
14b00 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
14b10 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
14b20 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
14b30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61  .  /* If the sta
14b40 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
14b50 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
14b60 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
14b70 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74  ,.  ** then writ
14b80 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
14b90 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
14ba0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
14bb0 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  te that.  ** the
14bc0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
14bd0 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
14be0 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
14bf0 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
14c00 61 74 0a 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  at.  ** in that 
14c10 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
14c20 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
14c30 65 61 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  eader..  */.  if
14c40 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
14c50 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53  Use && !pPg->inS
14c60 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  tmt && (int)pPg-
14c70 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
14c80 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  tmtSize ){.    a
14c90 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
14ca0 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
14cb0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
14cc0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
14cd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
14ce0 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48  mDb ){.      PgH
14cf0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
14d00 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
14d10 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
14d20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
14d30 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >pStmt==0 );.   
14d40 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
14d50 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
14d60 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  w( pPager->pageS
14d70 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
14d80 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
14d90 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
14da0 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47  pHist->pStmt, PG
14db0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
14dc0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
14dd0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
14de0 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
14df0 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25 64 5c  JOURNAL page %d\
14e00 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  n", pPg->pgno);.
14e10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14e20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67   store32bits(pPg
14e30 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29  ->pgno, pPg, -4)
14e40 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
14e50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
14e60 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
14e70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14e80 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 73  Write(&pPager->s
14e90 74 66 64 2c 20 28 28 63 68 61 72 2a 29 70 44 61  tfd, ((char*)pDa
14ea0 74 61 29 2d 34 2c 20 53 51 4c 49 54 45 5f 50 41  ta)-4, SQLITE_PA
14eb0 47 45 5f 53 49 5a 45 2b 34 29 3b 0a 20 20 20 20  GE_SIZE+4);.    
14ec0 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 4a    TRACE2("STMT-J
14ed0 4f 55 52 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e  OURNAL page %d\n
14ee0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ", pPg->pgno);. 
14ef0 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
14f00 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
14f10 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  gno, 0);.      i
14f20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14f30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14f40 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
14f50 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
14f60 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
14f70 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
14f80 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 72 65  FULL;.        re
14f90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
14fa0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
14fb0 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  tmtNRec++;.     
14fc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14fd0 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
14fe0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
14ff0 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
15000 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
15010 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20  no&7);.    }.   
15020 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
15030 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  t_list(pPg);.  }
15040 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
15050 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
15060 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
15070 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
15080 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e  bSize<(int)pPg->
15090 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
150a0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
150b0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  ->pgno;.    if( 
150c0 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26  !pPager->memDb &
150d0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
150e0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
150f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
15100 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
15110 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d  >dbSize++;.    }
15120 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15140 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
15150 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
15160 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
15170 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
15180 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  * to sqlite3page
15190 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  r_write().  In o
151a0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
151b0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
151c0 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
151d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
151e0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74  the page..*/.int
151f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
15200 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a  writeable(void *
15210 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
15220 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
15230 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72  GHDR(pData);.  r
15240 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
15250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  ;.}../*.** Repla
15260 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ce the content o
15270 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
15280 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61  with the informa
15290 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72  tion in the thir
152a0 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
152b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
152c0 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61 67  er_overwrite(Pag
152d0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
152e0 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61   pgno, void *pDa
152f0 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61  ta){.  void *pPa
15300 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ge;.  int rc;.. 
15310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
15320 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70  er_get(pPager, p
15330 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
15340 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15350 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
15360 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
15370 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
15380 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15390 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
153a0 50 61 67 65 2c 20 70 44 61 74 61 2c 20 53 51 4c  Page, pData, SQL
153b0 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
153c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
153d0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
153e0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
153f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
15400 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
15410 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
15420 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
15430 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
15440 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
15450 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
15460 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74  ge "pgno" back t
15470 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
15480 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
15490 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
154a0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
154b0 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
154c0 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
154d0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
154e0 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
154f0 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
15500 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
15510 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
15520 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
15530 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
15540 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
15550 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
15560 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
15570 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
15580 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
15590 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
155a0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61  the.** sqlite3pa
155b0 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
155c0 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20  k() below, more 
155d0 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20  than double the 
155e0 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67  speed.** of larg
155f0 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  e INSERT operati
15600 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c  ons and quadrupl
15610 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
15620 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a  arge DELETEs..**
15630 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
15640 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
15650 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52   set the alwaysR
15660 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20  ollback flag to 
15670 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75  true..** Subsequ
15680 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
15690 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
156a0 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
156b0 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77  e same page.** w
156c0 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62  ill thereafter b
156d0 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  e ignored.  This
156e0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
156f0 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d   avoid a problem
15700 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65  .** where a page
15710 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64   with data is ad
15720 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
15730 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70  ist during one p
15740 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e  art of.** a tran
15750 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d  saction then rem
15760 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
15770 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20  eelist during a 
15780 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66  later part.** of
15790 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
157a0 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ction and reused
157b0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
157c0 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69  purpose.  When i
157d0 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64  t.** is first ad
157e0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
157f0 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
15800 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68  e is called.  Wh
15810 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68  en reused,.** th
15820 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
15830 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  ) routine is cal
15840 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73  led.  But becaus
15850 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  e the page conta
15860 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20  ins.** critical 
15870 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e  data, we still n
15880 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69  eed to be sure i
15890 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61  t gets rolled ba
158a0 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f  ck in spite.** o
158b0 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  f the dont_rollb
158c0 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76  ack() call..*/.v
158d0 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
158e0 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67 65  _dont_write(Page
158f0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
15900 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
15910 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  pPg;..  if( pPag
15920 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65 74 75  er->memDb ) retu
15930 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67  rn;..  pPg = pag
15940 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
15950 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e  , pgno);.  pPg->
15960 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
15970 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26   1;.  if( pPg &&
15980 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20   pPg->dirty ){. 
15990 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
159a0 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d  bSize==(int)pPg-
159b0 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d  >pgno && pPager-
159c0 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67  >origDbSize<pPag
159d0 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
159e0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
159f0 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74  ages is the last
15a00 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
15a10 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
15a20 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a  as grown.      *
15a30 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  * during the cur
15a40 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
15a50 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61  , then do NOT ma
15a60 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
15a70 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57  lean..      ** W
15a80 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
15a90 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20   file grows, we 
15aa0 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
15ab0 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
15ac0 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20  e.      ** gets 
15ad0 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74  written at least
15ae0 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68   once so that th
15af0 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c  e disk file will
15b00 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a   be the correct.
15b10 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49        ** size. I
15b20 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69  f you do not wri
15b30 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64  te this page and
15b40 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
15b50 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f   file.      ** o
15b60 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20  n the disk ends 
15b70 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61  up being too sma
15b80 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61  ll, that can lea
15b90 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20  d to database.  
15ba0 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f      ** corruptio
15bb0 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78  n during the nex
15bc0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
15bd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
15be0 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  e{.      TRACE3(
15bf0 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
15c00 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67   %d of %d\n", pg
15c10 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  no, pPager->fd.h
15c20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
15c30 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rty = 0;.    }. 
15c40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61   }.}../*.** A ca
15c50 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
15c60 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
15c70 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c  er that if a rol
15c80 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a  lback occurs,.**
15c90 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
15ca0 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20  sary to restore 
15cb0 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20  the data on the 
15cc0 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69  given page.  Thi
15cd0 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  s.** means that 
15ce0 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
15cf0 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72  ot have to recor
15d00 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  d the given page
15d10 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62   in the.** rollb
15d20 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ack journal..*/.
15d30 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
15d40 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
15d50 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
15d60 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
15d70 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
15d80 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
15d90 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
15da0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
15db0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 45 58  >state!=PAGER_EX
15dc0 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61 67 65  CLUSIVE || pPage
15dd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
15de0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
15df0 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
15e00 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  lback || pPager-
15e10 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
15e20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  || pPager->memDb
15e30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
15e40 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
15e50 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
15e60 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
15e70 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
15e80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15e90 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
15ea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
15eb0 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
15ec0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
15ed0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50  >pgno&7);.    pP
15ee0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
15ef0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
15f00 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
15f10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
15f20 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
15f30 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
15f40 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67  no&7);.      pag
15f50 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
15f60 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
15f70 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
15f80 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64  ROLLBACK page %d
15f90 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
15fa0 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66 64  pgno, pPager->fd
15fb0 2e 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  .h);.  }.  if( p
15fc0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
15fd0 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
15fe0 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
15ff0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
16000 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
16010 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
16020 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
16030 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
16040 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
16050 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
16060 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
16070 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
16080 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
16090 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
160a0 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f  );.    page_add_
160b0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
160c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
160d0 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f   Clear a PgHisto
160e0 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  ry block.*/.stat
160f0 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73  ic void clearHis
16100 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a  tory(PgHistory *
16110 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pHist){.  sqlite
16120 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69  Free(pHist->pOri
16130 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  g);.  sqliteFree
16140 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
16150 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
16160 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74   0;.  pHist->pSt
16170 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mt = 0;.}../*.**
16180 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
16190 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
161a0 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
161b0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
161c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
161d0 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
161e0 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
161f0 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
16200 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
16210 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
16220 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
16230 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
16240 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
16250 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
16260 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
16270 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
16280 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
16290 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
162a0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
162b0 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  k==PAGER_ERR_FUL
162c0 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  L ){.    rc = sq
162d0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
162e0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
162f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16300 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
16310 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
16320 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
16330 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
16340 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
16350 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
16360 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
16370 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
16380 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
16390 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
163a0 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
163b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
163c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  ROR;.  }.  TRACE
163d0 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
163e0 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
163f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
16400 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  mDb ){.    pPg =
16410 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
16420 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
16430 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  r);.    while( p
16440 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  Pg ){.      clea
16450 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54  rHistory(PGHDR_T
16460 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
16470 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  er));.      pPg-
16480 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
16490 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
164a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
164b0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
164c0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
164d0 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
164e0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
164f0 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  g = pPg->pDirty;
16500 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
16510 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50  DEBUG.    for(pP
16520 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
16530 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
16540 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
16550 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
16560 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
16570 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
16580 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
16590 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
165a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
165b0 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
165c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
165d0 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
165e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
165f0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
16600 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
16610 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
16620 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
16630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16640 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
16650 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b  dirtyCache==0 ){
16660 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72  .    /* Exit ear
16670 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e  ly (without doin
16680 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75  g the time-consu
16690 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53 79  ming sqlite3OsSy
166a0 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20  nc() calls).    
166b0 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76 65  ** if there have
166c0 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   been no changes
166d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
166e0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73   file. */.    as
166f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
16700 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
16710 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
16720 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
16730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
16740 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65  ize = -1;.    re
16750 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
16760 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
16770 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
16780 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
16790 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20 30  r_sync(pPager, 0
167a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
167b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
167c0 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
167d0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65  .  }.  rc = page
167e0 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
167f0 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
16800 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
16810 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
16820 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e   Jump here if an
16830 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
16840 67 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  g during the com
16850 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  mit process..  *
16860 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a  /.commit_abort:.
16870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
16880 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
16890 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ger);.  if( rc==
168a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
168b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
168c0 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  L;.  }.  return 
168d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
168e0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
168f0 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
16900 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
16910 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
16920 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
16930 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
16940 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
16950 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
16960 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
16970 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
16980 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16990 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
169a0 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
169b0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
169c0 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
169d0 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
169e0 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
169f0 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
16a00 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
16a10 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
16a20 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
16a30 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
16a40 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
16a50 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
16a60 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
16a70 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
16a80 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
16a90 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
16aa0 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
16ab0 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
16ac0 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
16ad0 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
16ae0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
16af0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
16b00 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
16b10 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
16b20 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43    int rc;.  TRAC
16b30 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
16b40 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
16b50 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
16b60 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 50 67  >memDb ){.    Pg
16b70 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
16b80 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
16b90 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
16ba0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
16bb0 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
16bc0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77   assert( !p->alw
16bd0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
16be0 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72       if( !p->dir
16bf0 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
16c00 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
16c10 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
16c20 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
16c30 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  pOrig );.       
16c40 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
16c50 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
16c60 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
16c70 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  )->pStmt );.    
16c80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
16c90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69      }..      pHi
16ca0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
16cb0 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
16cc0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
16cd0 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
16ce0 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
16cf0 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
16d00 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
16d10 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16d20 20 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42     TRACE2("ROLLB
16d30 41 43 4b 2d 50 41 47 45 20 25 64 5c 6e 22 2c 20  ACK-PAGE %d\n", 
16d40 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  p->pgno);.      
16d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
16d60 52 41 43 45 32 28 22 50 41 47 45 20 25 64 20 69  RACE2("PAGE %d i
16d70 73 20 63 6c 65 61 6e 5c 6e 22 2c 20 70 2d 3e 70  s clean\n", p->p
16d80 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
16d90 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
16da0 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
16db0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
16dc0 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
16dd0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
16de0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
16df0 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  p->pPrevStmt = p
16e00 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
16e10 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
16e20 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
16e30 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
16e40 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52  >xReiniter(PGHDR
16e50 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50 61  _TO_DATA(p), pPa
16e60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
16e70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
16e80 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
16e90 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
16ea0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
16eb0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
16ec0 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54  ize;.    memoryT
16ed0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
16ee0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
16ef0 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
16f00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
16f10 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
16f20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16f30 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
16f40 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
16f50 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
16f60 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
16f70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
16f80 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
16f90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
16fa0 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
16fb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
16fc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
16fd0 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65  Mask!=0 && pPage
16fe0 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45  r->errMask!=PAGE
16ff0 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
17000 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17010 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
17020 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
17030 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
17040 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
17050 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
17060 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
17070 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
17080 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
17090 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERVED ){.    int
170a0 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70   rc2;.    rc = p
170b0 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
170c0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
170d0 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  c2 = pager_unwri
170e0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
170f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
17110 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
17120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
17130 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
17140 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
17150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17160 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
17170 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
17180 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
17190 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f   |= PAGER_ERR_CO
171a0 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  RRUPT;.  }.  pPa
171b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
171c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
171d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
171e0 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
171f0 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
17200 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
17210 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
17220 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
17230 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
17240 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  itable..*/.int s
17250 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72 65  qlite3pager_isre
17260 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
17270 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
17280 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
17290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
172a0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
172b0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
172c0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
172d0 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61  /.int *sqlite3pa
172e0 67 65 72 5f 73 74 61 74 73 28 50 61 67 65 72 20  ger_stats(Pager 
172f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
17300 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61  ic int a[9];.  a
17310 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [0] = pPager->nR
17320 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61  ef;.  a[1] = pPa
17330 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b  ger->nPage;.  a[
17340 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50  2] = pPager->mxP
17350 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  age;.  a[3] = pP
17360 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
17370 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
17380 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
17390 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a  Pager->errMask;.
173a0 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
173b0 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
173c0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
173d0 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[8] = pPager->
173e0 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20  nOvfl;.  return 
173f0 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  a;.}../*.** Set 
17400 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  the statement ro
17410 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a  llback point..**
17420 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17430 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
17440 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73  d with the trans
17450 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61  action journal a
17460 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20  lready.** open. 
17470 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74   A new statement
17480 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61   journal is crea
17490 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20  ted that can be 
174a0 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  used to rollback
174b0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61  .** changes of a
174c0 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d   single SQL comm
174d0 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72  and within a lar
174e0 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ger transaction.
174f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
17500 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28  ager_stmt_begin(
17510 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
17520 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
17530 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
17540 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20  MPNAME_SIZE];.  
17550 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
17560 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20  >stmtInUse );.  
17570 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47  TRACE2("STMT-BEG
17580 49 4e 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  IN %d\n", pPager
17590 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70  ->fd.h);.  if( p
175a0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
175b0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
175c0 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70  InUse = 1;.    p
175d0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
175e0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
175f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17600 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
17610 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
17620 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50  alOpen ){.    pP
17630 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
17640 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  en = 1;.    retu
17650 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17660 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
17670 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
17680 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
17690 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
176a0 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
176b0 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
176c0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
176d0 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  mt==0 ){.    sql
176e0 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
176f0 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
17700 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OCK);.    return
17710 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
17720 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
17730 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  G.  rc = sqlite3
17740 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
17750 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
17760 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
17770 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
17780 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
17790 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
177a0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20  r->stmtJSize == 
177b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
177c0 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  ff );.#endif.  p
177d0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
177e0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
177f0 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
17800 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
17810 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50  er->dbSize;.  pP
17820 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
17830 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17840 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67  stmtCksum = pPag
17850 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
17860 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74   if( !pPager->st
17870 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  mtOpen ){.    rc
17880 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
17890 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
178a0 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
178b0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
178c0 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
178d0 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  led;.    pPager-
178e0 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >stmtOpen = 1;. 
178f0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
17900 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
17910 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
17920 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
17930 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74  QLITE_OK;. .stmt
17940 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
17950 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
17960 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
17970 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
17980 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
17990 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
179a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
179b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
179c0 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  it a statement..
179d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
179e0 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
179f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
17a00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17a10 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
17a20 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
17a30 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53  t;.    TRACE2("S
17a40 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
17a50 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
17a60 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
17a70 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
17a80 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
17a90 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
17aa0 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
17ab0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50  e3OsTruncate(&pP
17ac0 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20  ager->stfd, 0); 
17ad0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
17ae0 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
17af0 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
17b00 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
17b10 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
17b20 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
17b30 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  mt; pPg; pPg=pNe
17b40 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74  xt){.      pNext
17b50 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
17b60 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
17b70 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a   pPg->inStmt );.
17b80 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
17b90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
17ba0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
17bb0 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
17bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
17bd0 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
17be0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
17bf0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
17c00 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
17c10 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
17c20 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
17c30 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48  tmt);.        pH
17c40 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
17c50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17c60 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
17c70 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
17c80 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
17c90 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
17ca0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
17cb0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
17cc0 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
17cd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17ce0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
17cf0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
17d00 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
17d10 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50  _stmt_rollback(P
17d20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
17d30 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
17d40 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
17d50 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22   ){.    TRACE2("
17d60 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
17d70 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
17d80 68 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  h);.    if( pPag
17d90 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
17da0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
17db0 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61       for(pPg=pPa
17dc0 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
17dd0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53   pPg=pPg->pNextS
17de0 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  tmt){.        Pg
17df0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
17e00 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
17e10 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
17e20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
17e30 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
17e40 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
17e50 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48  TO_DATA(pPg), pH
17e60 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67  ist->pStmt, pPag
17e70 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
17e80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
17e90 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
17ea0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
17eb0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
17ec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17ed0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
17ee0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
17ef0 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20  stmtSize;.      
17f00 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
17f10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
17f20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
17f40 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  c = pager_stmt_p
17f50 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
17f60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
17f70 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
17f80 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
17f90 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
17fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17fb0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
17fc0 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
17fd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17fe0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
17ff0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
18000 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
18010 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
18020 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e  lite3pager_filen
18030 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
18040 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
18050 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
18060 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18070 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
18080 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18090 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
180a0 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
180b0 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  dirname(Pager *p
180c0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
180d0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
180e0 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
180f0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
18100 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
18110 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
18120 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
18130 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e  e3pager_journaln
18140 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
18150 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
18160 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d  ger->zJournal;.}
18170 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
18180 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
18190 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
181a0 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f  ite3pager_set_co
181b0 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
181c0 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78  ager,.  void (*x
181d0 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
181e0 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
181f0 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
18200 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
18210 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
18220 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
18230 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
18240 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
18250 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
18260 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
18270 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
18280 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
18290 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
182a0 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
182b0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
182c0 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
182d0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
182e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76  er *pPager){.  v
182f0 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67  oid *pPage;.  Pg
18300 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75  Hdr *pPgHdr;.  u
18310 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
18320 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
18330 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
18340 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
18350 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  riting. */.  rc 
18360 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
18370 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
18380 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
18390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
183a0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
183b0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
183c0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
183d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
183e0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
183f0 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e   Read the curren
18400 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20  t value at byte 
18410 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20  24. */.  pPgHdr 
18420 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
18430 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65  pPage);.  change
18440 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69  _counter = retri
18450 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72  eve32bits(pPgHdr
18460 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63  , 24);..  /* Inc
18470 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
18480 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
18490 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
184a0 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68  byte 24. */.  ch
184b0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
184c0 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63 68    store32bits(ch
184d0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50  ange_counter, pP
184e0 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a  gHdr, 24);..  /*
184f0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
18500 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
18510 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
18520 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72  nref(pPage);.  r
18530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
18550 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18560 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
18570 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
18580 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
18590 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
185a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
185b0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
185c0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
185d0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
185e0 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
185f0 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
18600 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
18610 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
18620 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
18630 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
18640 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
18650 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18660 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
18670 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
18680 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
18690 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
186a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
186b0 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
186c0 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
186d0 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
186e0 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
186f0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
18700 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
18710 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
18720 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
18730 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18740 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
18750 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
18760 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
18770 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
18780 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
18790 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
187a0 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
187b0 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
187c0 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ) call..*/.int s
187d0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
187e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
187f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
18800 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
18810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
18820 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
18830 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
18840 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
18850 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
18860 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
18870 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
18880 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
18890 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
188a0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
188b0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
188c0 4e 43 45 44 20 26 26 20 21 70 50 61 67 65 72 2d  NCED && !pPager-
188d0 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72  >memDb && pPager
188e0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
188f0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
18900 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18910 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18920 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  );..    /* If a 
18930 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18940 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
18950 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
18960 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
18970 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
18980 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
18990 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
189a0 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
189b0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
189c0 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
189d0 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
189e0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
189f0 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
18a00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
18a10 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
18a20 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
18a30 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
18a40 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
18a50 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
18a60 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
18a70 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
18a80 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
18a90 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
18aa0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
18ab0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
18ac0 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  unter(pPager);. 
18ad0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18ae0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
18af0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72  nc_exit;.      r
18b00 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
18b10 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
18b20 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
18b30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18b40 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
18b50 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  t;.      rc = sy
18b60 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
18b70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
18b90 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
18ba0 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   }..    /* Write
18bb0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
18bc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18bd0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
18be0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
18bf0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
18c00 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ger);.    rc = p
18c10 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
18c20 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ist(pPg);.    if
18c30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18c40 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
18c50 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
18c60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18c70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
18c80 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
18c90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18ca0 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72  e3OsSync(&pPager
18cb0 2d 3e 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ->fd);.    }..  
18cc0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
18cd0 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
18ce0 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
18cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18d00 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
18d10 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
18d20 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
18d30 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
18d40 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
18d50 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63   of the file loc
18d60 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
18d70 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65  pager..** The re
18d80 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e  turn value is on
18d90 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  e of NO_LOCK, SH
18da0 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
18db0 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e  VED_LOCK,.** PEN
18dc0 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58  DING_LOCK, or EX
18dd0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f  CLUSIVE_LOCK..*/
18de0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
18df0 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65  r_lockstate(Page
18e00 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64  r *pPager){.#ifd
18e10 65 66 20 4f 53 5f 54 45 53 54 0a 20 20 72 65 74  ef OS_TEST.  ret
18e20 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  urn pPager->fd->
18e30 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6c  fd.locktype;.#el
18e40 73 65 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  se.  return pPag
18e50 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b  er->fd.locktype;
18e60 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66  .#endif.}.#endif
18e70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18e80 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  TEST./*.** Print
18e90 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
18ea0 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
18eb0 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
18ec0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
18ed0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
18ee0 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67  dump(Pager *pPag
18ef0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
18f00 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  g;.  for(pPg=pPa
18f10 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
18f20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
18f30 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  l){.    if( pPg-
18f40 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69  >nRef<=0 ) conti
18f50 6e 75 65 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  nue;.    printf(
18f60 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 30  "PAGE %3d addr=0
18f70 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22  x%08x nRef=%d\n"
18f80 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
18f90 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f  gno, (int)PGHDR_
18fa0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
18fb0 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a  g->nRef);.  }.}.
18fc0 23 65 6e 64 69 66 0a                             #endif.