/ Hex Artifact Content
Login

Artifact e3969171742e7d9681977703feed4853f5ee206a:


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: 33 20 32 30 30 34 2f 30 36 2f 32 36 20 30 31 3a  3 2004/06/26 01:
0360: 34 38 3a 31 39 20 64 61 6e 69 65 6c 6b 31 39 37  48:19 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 72 65 74 75 72 6e 20  e ){.    return 
c890: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c8a0: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
c8b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
c8c0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
c8d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
c8e0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
c8f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
c900: 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20    }.  nameLen = 
c910: 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68  strlen(zFullPath
c920: 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20  name);.  pPager 
c930: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
c940: 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
c950: 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30  + nameLen*3 + 30
c960: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
c970: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
c980: 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
c990: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
c9a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
c9b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c9c0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 45  _NOMEM;.  }.  SE
c9d0: 54 5f 50 41 47 45 52 28 70 50 61 67 65 72 29 3b  T_PAGER(pPager);
c9e0: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
c9f0: 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
ca00: 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67  Pager[1];.  pPag
ca10: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d  er->zDirectory =
ca20: 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e   &pPager->zFilen
ca30: 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ame[nameLen+1];.
ca40: 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
ca50: 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44  al = &pPager->zD
ca60: 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e  irectory[nameLen
ca70: 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50  +1];.  strcpy(pP
ca80: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
ca90: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
caa0: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
cab0: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46  ->zDirectory, zF
cac0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
cad0: 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69  for(i=nameLen; i
cae0: 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
caf0: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
cb00: 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
cb10: 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
cb20: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
cb30: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61   0;.  strcpy(pPa
cb40: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
cb50: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
cb60: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
cb70: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74  lPathname);.  st
cb80: 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  rcpy(&pPager->zJ
cb90: 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c  ournal[nameLen],
cba0: 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20   "-journal");.  
cbb0: 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b  pPager->fd = fd;
cbc0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
cbd0: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50  alOpen = 0;.  pP
cbe0: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
cbf0: 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26   = useJournal &&
cc00: 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65   !memDb;.  pPage
cc10: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
cc20: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
cc30: 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  nUse = 0;.  pPag
cc40: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
cc50: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
cc60: 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67   memDb-1;.  pPag
cc70: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53  er->pageSize = S
cc80: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b  QLITE_PAGE_SIZE;
cc90: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
cca0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
ccb0: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
ccc0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
ccd0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
cce0: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
ccf0: 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a 20 31 30  >5 ? mxPage : 10
cd00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
cd10: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
cd20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  ;.  pPager->errM
cd30: 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ask = 0;.  pPage
cd40: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
cd50: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
cd60: 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b  ->memDb = memDb;
cd70: 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
cd80: 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
cd90: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
cda0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
cdb0: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
cdc0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
cdd0: 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
cde0: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
cdf0: 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
ce00: 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d  ?0:1);.  pPager-
ce10: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
ce20: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
ce30: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
ce40: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
ce50: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
ce60: 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65   nExtra;.  pPage
ce70: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
ce80: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
ce90: 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  E;.  pPager->pBu
cea0: 73 79 48 61 6e 64 6c 65 72 20 3d 20 28 42 75 73  syHandler = (Bus
ceb0: 79 48 61 6e 64 6c 65 72 20 2a 29 70 42 75 73 79  yHandler *)pBusy
cec0: 48 61 6e 64 6c 65 72 3b 0a 20 20 6d 65 6d 73 65  Handler;.  memse
ced0: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
cee0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
cef0: 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70  r->aHash));.  *p
cf00: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
cf10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cf20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
cf30: 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
cf40: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
cf50: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
cf60: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
cf70: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
cf80: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
cf90: 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
cfa0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
cfb0: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
cfc0: 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
cfd0: 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
cfe0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
cff0: 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
d000: 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
d010: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
d020: 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
d030: 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
d040: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
d050: 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74  ose().  .** Dest
d060: 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79  ructors are only
d070: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
d080: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
d090: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d0a0: 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75  pager_set_destru
d0b0: 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  ctor(Pager *pPag
d0c0: 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63  er, void (*xDesc
d0d0: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20  )(void*,int)){. 
d0e0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
d0f0: 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
d100: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
d110: 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
d120: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
d130: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
d140: 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
d150: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
d160: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
d170: 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
d180: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
d190: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
d1a0: 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
d1b0: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
d1c0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
d1d0: 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
d1e0: 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
d1f0: 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
d200: 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
d210: 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
d220: 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
d230: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
d240: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
d250: 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61  _set_reiniter(Pa
d260: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
d270: 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69  d (*xReinit)(voi
d280: 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  d*,int)){.  pPag
d290: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
d2a0: 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
d2b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
d2c0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
d2d0: 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
d2e0: 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
d2f0: 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a  ith.** pPager..*
d300: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
d310: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67  er_pagecount(Pag
d320: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f  er *pPager){.  o
d330: 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65 72 74  ff_t n;.  assert
d340: 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
d350: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
d360: 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65  ize>=0 ){.    re
d370: 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  turn pPager->dbS
d380: 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ize;.  }.  if( s
d390: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d3a0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  (&pPager->fd, &n
d3b0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
d3c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
d3d0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
d3e0: 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74 75 72  _DISK;.    retur
d3f0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20  n 0;.  }.  n /= 
d400: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
d410: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
d420: 3e 6d 65 6d 44 62 20 26 26 20 6e 3d 3d 50 45 4e  >memDb && n==PEN
d430: 44 49 4e 47 5f 42 59 54 45 2f 53 51 4c 49 54 45  DING_BYTE/SQLITE
d440: 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
d450: 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
d460: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
d470: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
d480: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
d490: 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65  ze = n;.  }.  re
d4a0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
d4b0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
d4c0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
d4d0: 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
d4e0: 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  ager*);.../*.** 
d4f0: 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72  Unlink a page fr
d500: 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
d510: 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c   (the list of al
d520: 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  l pages where nR
d530: 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72  ef==0).** and fr
d540: 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c  om its hash coll
d550: 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a  ision chain..*/.
d560: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
d570: 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  nkPage(PgHdr *pP
d580: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
d590: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
d5a0: 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68  r;..  /* Keep th
d5b0: 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20 70  e pFirstSynced p
d5c0: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20  ointer pointing 
d5d0: 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79 6e  at the first syn
d5e0: 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a  chronized page *
d5f0: 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61  /.  if( pPg==pPa
d600: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
d610: 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  d ){.    PgHdr *
d620: 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
d630: 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ee;.    while( p
d640: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
d650: 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
d660: 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65  ree; }.    pPage
d670: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
d680: 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = p;.  }..  /* U
d690: 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66  nlink from the f
d6a0: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28  reelist */.  if(
d6b0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
d6c0: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  ){.    pPg->pPre
d6d0: 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
d6e0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
d6f0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
d700: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d710: 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20  pFirst==pPg );. 
d720: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
d730: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
d740: 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ee;.  }.  if( pP
d750: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
d760: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
d770: 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
d780: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
d790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
d7a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61  ert( pPager->pLa
d7b0: 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
d7c0: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
d7d0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
d7e0: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46   }.  pPg->pNextF
d7f0: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
d800: 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Free = 0;..  /* 
d810: 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
d820: 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20  pgno hash table 
d830: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  */.  if( pPg->pN
d840: 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
d850: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
d860: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
d870: 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
d880: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
d890: 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
d8a0: 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
d8b0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
d8c0: 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
d8d0: 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65      int h = page
d8e0: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
d8f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d900: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
d910: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
d920: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
d930: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
d940: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
d950: 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
d960: 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
d970: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d980: 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
d990: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
d9a0: 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65   database.  Dele
d9b0: 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20  te.** all pages 
d9c0: 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61  whose pgno is la
d9d0: 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
d9e0: 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
d9f0: 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
da00: 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
da10: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
da20: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
da30: 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74   zeroed..*/.stat
da40: 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72  ic void memoryTr
da50: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
da60: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
da70: 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
da80: 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
da90: 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
daa0: 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
dab0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
dac0: 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
dad0: 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
dae0: 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
daf0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
db00: 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
db10: 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
db20: 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
db30: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
db40: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
db50: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
db60: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
db70: 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
db80: 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
db90: 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
dba0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
dbb0: 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
dbc0: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
dbd0: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
dbe0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
dbf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
dc00: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
dc10: 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75  e file to the nu
dc20: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70  mber of pages sp
dc30: 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ecified..*/.int 
dc40: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
dc50: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
dc60: 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
dc70: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
dc80: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
dc90: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
dca0: 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
dcb0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
dcc0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
dcd0: 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
dce0: 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
dcf0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
dd00: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
dd10: 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67  f( nPage>=(unsig
dd20: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
dd30: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
dd40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
dd50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
dd60: 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
dd70: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
dd80: 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
dd90: 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
dda0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ddb0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
ddc0: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
ddd0: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
dde0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ddf0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
de00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
de10: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
de20: 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  >fd, SQLITE_PAGE
de30: 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6e 50 61  _SIZE*(off_t)nPa
de40: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
de50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
de60: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
de70: 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65   nPage;.  }.  re
de80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
de90: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
dea0: 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
deb0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
dec0: 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
ded0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
dee0: 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
def0: 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
df00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
df10: 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
df20: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
df30: 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
df40: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
df50: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
df60: 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
df70: 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
df80: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
df90: 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
dfa0: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
dfb0: 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
dfc0: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
dfd0: 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
dfe0: 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
dff0: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
e000: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
e010: 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  _close(Pager *pP
e020: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
e030: 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73  pPg, *pNext;.  s
e040: 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73  witch( pPager->s
e050: 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65  tate ){.    case
e060: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a   PAGER_RESERVED:
e070: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
e080: 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73  SYNCED: .    cas
e090: 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  e PAGER_EXCLUSIV
e0a0: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
e0b0: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
e0c0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
e0d0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
e0e0: 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Db ){.        sq
e0f0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
e100: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
e110: 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
e120: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e130: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
e140: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
e150: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e160: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20 7b   PAGER_SHARED: {
e170: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
e180: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
e190: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
e1a0: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
e1b0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
e1c0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e1d0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
e1e0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
e1f0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
e200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e210: 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50    }.  for(pPg=pP
e220: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
e230: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66   pPg=pNext){.#if
e240: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
e250: 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
e260: 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  b ){.      PgHis
e270: 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
e280: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
e290: 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
e2a0: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
e2b0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
e2c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
e2d0: 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
e2e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
e2f0: 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
e300: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
e310: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
e320: 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
e330: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
e340: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
e350: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
e360: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
e370: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
e380: 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
e390: 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
e3a0: 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
e3b0: 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
e3c0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
e3d0: 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
e3e0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
e3f0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
e400: 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43 4c 52 5f  ** }.  */.  CLR_
e410: 50 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20  PAGER(pPager);. 
e420: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69   if( pPager->zFi
e430: 6c 65 6e 61 6d 65 21 3d 28 63 68 61 72 2a 29 26  lename!=(char*)&
e440: 70 50 61 67 65 72 5b 31 5d 20 29 7b 0a 20 20 20  pPager[1] ){.   
e450: 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f   assert( 0 );  /
e460: 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20  * Cannot happen 
e470: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
e480: 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
e490: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
e4a0: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Free(pPager->zJo
e4b0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
e4c0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
e4d0: 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a  Directory);.  }.
e4e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
e4f0: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
e500: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e510: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
e520: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
e530: 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
e540: 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
e550: 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62  e3pager_pagenumb
e560: 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  er(void *pData){
e570: 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44 41  .  PgHdr *p = DA
e580: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
e590: 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  a);.  return p->
e5a0: 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pgno;.}../*.** T
e5b0: 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75  he page_ref() fu
e5c0: 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74  nction increment
e5d0: 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
e5e0: 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
e5f0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  ..** If the page
e600: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
e610: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74   the freelist (t
e620: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
e630: 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e  nt is zero) then
e640: 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72  .** remove it fr
e650: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  om the freelist.
e660: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74  .**.** For non-t
e670: 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
e680: 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63  e_ref() is a mac
e690: 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70  ro that calls _p
e6a0: 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c  age_ref().** onl
e6b0: 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72  ine of the refer
e6c0: 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
e6d0: 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79  ro.  For test sy
e6e0: 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
e6f0: 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66  ).** is a real f
e700: 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  unction so that 
e710: 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b  we can set break
e720: 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65  points and trace
e730: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
e740: 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67  oid _page_ref(Pg
e750: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
e760: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
e770: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
e780: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
e790: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
e7a0: 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  Remove it. */.  
e7b0: 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e    if( pPg==pPg->
e7c0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
e7d0: 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  nced ){.      Pg
e7e0: 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
e7f0: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 77  extFree;.      w
e800: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
e810: 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
e820: 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
e830: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
e840: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
e850: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
e860: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
e870: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
e880: 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
e890: 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
e8a0: 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
e8b0: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
e8c0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
e8d0: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
e8e0: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
e8f0: 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
e900: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
e910: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
e920: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
e930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
e940: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73  Pg->pPager->pLas
e950: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
e960: 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ee;.    }.    pP
e970: 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b  g->pPager->nRef+
e980: 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52  +;.  }.  pPg->nR
e990: 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef++;.  REFINFO(
e9a0: 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  pPg);.}.#ifdef S
e9b0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61  QLITE_TEST.  sta
e9c0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
e9d0: 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
e9e0: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
e9f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
ea00: 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
ea10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
ea20: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  g->nRef++;.     
ea30: 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20   REFINFO(pPg);. 
ea40: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23     }.  }.#else.#
ea50: 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66   define page_ref
ea60: 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66  (P)   ((P)->nRef
ea70: 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29  ==0?_page_ref(P)
ea80: 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66  :(void)(P)->nRef
ea90: 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ++).#endif../*.*
eaa0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
eab0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
eac0: 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65  for a page.  The
ead0: 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69   input pointer i
eae0: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
eaf0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   to the page dat
eb00: 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  a..*/.int sqlite
eb10: 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20  3pager_ref(void 
eb20: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
eb30: 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
eb40: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
eb50: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
eb60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
eb70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
eb80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
eb90: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
eba0: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
ebb0: 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
ebc0: 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
ebd0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
ebe0: 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
ebf0: 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
ec00: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
ec10: 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  .  It is not saf
ec20: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
ec30: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
ec40: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74  e file until aft
ec50: 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  er.** the journa
ec60: 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  l has been synce
ec70: 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69  d.  If the origi
ec80: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  nal database is 
ec90: 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a  modified before.
eca0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
ecb0: 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70  s synced and a p
ecc0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
ecd0: 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65  urs, the unsynce
ece0: 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74  d journal.** dat
ecf0: 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20  a would be lost 
ed00: 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20  and we would be 
ed10: 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65  unable to comple
ed20: 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68  tely rollback th
ed30: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
ed40: 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65  anges.  Database
ed50: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c   corruption woul
ed60: 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20  d occur..** .** 
ed70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
ed80: 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52  o updates the nR
ed90: 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
eda0: 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
edb0: 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63  urnal..** (See c
edc0: 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  omments on the p
edd0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
ede0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
edf0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
ee00: 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73  on.).** If the s
ee10: 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c  ync mode is FULL
ee20: 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c  , two syncs will
ee30: 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74   occur.  First t
ee40: 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
ee50: 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74  .** is synced, t
ee60: 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
ee70: 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74  ld is updated, t
ee80: 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e  hen a second syn
ee90: 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
eea0: 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  For temporary da
eeb0: 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e  tabases, we do n
eec0: 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72  ot care if we ar
eed0: 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
eee0: 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f  ck.** after a po
eef0: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20  wer failure, so 
ef00: 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
ef10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ef20: 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53  clears the needS
ef30: 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65  ync field of eve
ef40: 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20  ry page current 
ef50: 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72  held in.** memor
ef60: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
ef70: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
ef80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
ef90: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
efa0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
efb0: 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20  ..  /* Sync the 
efc0: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d  journal before m
efd0: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69  odifying the mai
efe0: 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  n database.  ** 
eff0: 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20  (assuming there 
f000: 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  is a journal and
f010: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
f020: 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20  synced.).  */.  
f030: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
f040: 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20  Sync ){.    if( 
f050: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
f060: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
f070: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
f080: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
f090: 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67  /* assert( !pPag
f0a0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f  er->noSync ); //
f0b0: 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65   noSync might be
f0c0: 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e   set if synchron
f0d0: 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73  ous.      ** was
f0e0: 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65   turned off afte
f0f0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
f100: 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20  n was started.  
f110: 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23  Ticket #615 */.#
f120: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
f130: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
f140: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
f150: 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e  Pager->nRec coun
f160: 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69  ter we are keepi
f170: 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20  ng agrees.      
f180: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52    ** with the nR
f190: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
f1a0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
f1b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
f1c0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f1d0: 20 20 6f 66 66 5f 74 20 6a 53 7a 3b 0a 20 20 20    off_t jSz;.   
f1e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f1f0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
f200: 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b  ger->jfd, &jSz);
f210: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
f220: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
f230: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f240: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f250: 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  ff==jSz );.     
f260: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
f270: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
f280: 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
f290: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
f2a0: 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
f2b0: 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
f2c0: 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
f2d0: 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
f2e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
f2f0: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
f300: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
f310: 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
f320: 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
f330: 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
f340: 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
f350: 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
f360: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
f370: 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20  llback. .       
f380: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
f390: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
f3a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52   ){.          TR
f3b0: 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
f3c0: 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  al of %d\n", pPa
f3d0: 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
f3e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f3f0: 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72  e3OsSync(&pPager
f400: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
f410: 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
f420: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
f430: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
f440: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
f450: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
f460: 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
f470: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f480: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
f490: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
f4a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
f4b0: 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
f4c0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
f4d0: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 73  n rc;..        s
f4e0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
f4f0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
f500: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
f520: 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
f530: 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  al of %d\n", pPa
f540: 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
f550: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f560: 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66  Sync(&pPager->jf
f570: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
f580: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
f590: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
f5a0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
f5b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
f5c0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
f5d0: 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65  0;..    /* Erase
f5e0: 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c   the needSync fl
f5f0: 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61  ag from every pa
f600: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ge..    */.    f
f610: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
f620: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
f630: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
f640: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
f650: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
f660: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
f670: 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
f680: 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66  pFirst;.  }..#if
f690: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
f6a0: 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
f6b0: 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63  edSync flag is c
f6c0: 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67  lear then the Pg
f6d0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a  Hdr.needSync.  *
f6e0: 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f  * flag must also
f6f0: 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c   be clear for al
f700: 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79  l pages.  Verify
f710: 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
f720: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75  invariant is tru
f730: 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
f740: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
f750: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
f760: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
f770: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
f780: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
f790: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  0 );.    }.    a
f7a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
f7b0: 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61  FirstSynced==pPa
f7c0: 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20  ger->pFirst );. 
f7d0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
f7e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f7f0: 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
f800: 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
f810: 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
f820: 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
f830: 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
f840: 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
f850: 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
f860: 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61  base file and ma
f870: 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61  rk them all.** a
f880: 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74  s clean..*/.stat
f890: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
f8a0: 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
f8b0: 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
f8c0: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e  er *pPager;.  in
f8d0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 75 73 79  t rc;.  int busy
f8e0: 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 70 4c 69   = 1;..  if( pLi
f8f0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  st==0 ) return S
f900: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
f910: 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
f920: 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  er;..  /* At thi
f930: 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
f940: 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
f950: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
f960: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
f970: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
f980: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
f990: 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
f9a0: 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
f9b0: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
f9c0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  lls to sqlite3Os
f9d0: 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70  Lock() are no-op
f9e0: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76  s..  **.  ** Mov
f9f0: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f  ing the lock fro
fa00: 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58  m RESERVED to EX
fa10: 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79  CLUSIVE actually
fa20: 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a   involves going.
fa30: 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20    ** through an 
fa40: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
fa50: 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20  te PENDING.   A 
fa60: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65  PENDING lock pre
fa70: 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72  vents new.  ** r
fa80: 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61  eaders from atta
fa90: 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  ching to the dat
faa0: 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73  abase but is uns
fab0: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73  ufficient for us
fac0: 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20   to.  ** write. 
fad0: 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50   The idea of a P
fae0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74  ENDING lock is t
faf0: 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65  o prevent new re
fb00: 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  aders from.  ** 
fb10: 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20  coming in while 
fb20: 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73  we wait for exis
fb30: 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20  ting readers to 
fb40: 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  clear..  **.  **
fb50: 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   While the pager
fb60: 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52   is in the RESER
fb70: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f  VED state, the o
fb80: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
fb90: 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e   file.  ** is un
fba0: 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63  changed and we c
fbb0: 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68  an rollback with
fbc0: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c  out having to pl
fbd0: 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20  ayback the.  ** 
fbe0: 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
fbf0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
fc00: 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77  se file.  Once w
fc10: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a  e transition to.
fc20: 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20    ** EXCLUSIVE, 
fc30: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  it means the dat
fc40: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62  abase file has b
fc50: 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20  een changed and 
fc60: 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  any rollback.  *
fc70: 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  * will require a
fc80: 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
fc90: 6b 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20  k..  */.  do {. 
fca0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fcb0: 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  sLock(&pPager->f
fcc0: 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
fcd0: 4b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  K);.  }while( rc
fce0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
fcf0: 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
fd00: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20  pBusyHandler && 
fd10: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
fd20: 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75  BusyHandler->xFu
fd30: 6e 63 20 26 26 20 0a 20 20 20 20 20 20 70 50 61  nc && .      pPa
fd40: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
fd50: 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d  r->xFunc(pPager-
fd60: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70  >pBusyHandler->p
fd70: 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20 29  Arg, busy++).  )
fd80: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
fd90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
fda0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
fdb0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
fdc0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a  GER_EXCLUSIVE;..
fdd0: 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
fde0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
fdf0: 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  ist->dirty );.  
fe00: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
fe10: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c  &pPager->fd, (pL
fe20: 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f 66  ist->pgno-1)*(of
fe30: 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f  f_t)SQLITE_PAGE_
fe40: 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45 43  SIZE);.    CODEC
fe50: 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
fe60: 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
fe70: 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
fe80: 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4f 52      TRACE2("STOR
fe90: 45 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 4c  E page %d\n", pL
fea0: 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
feb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
fec0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
fed0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
fee0: 4c 69 73 74 29 2c 20 53 51 4c 49 54 45 5f 50 41  List), SQLITE_PA
fef0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f  GE_SIZE);.    CO
ff00: 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
ff10: 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
ff20: 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 30  , pList->pgno, 0
ff30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
ff40: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
ff50: 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b  List->dirty = 0;
ff60: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
ff70: 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
ff80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ff90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c  OK;.}../*.** Col
ffa0: 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79  lect every dirty
ffb0: 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72   page into a dir
ffc0: 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72  ty list and.** r
ffd0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
ffe0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
fff0: 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70  hat list.  All p
10000 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c  ages are.** coll
10010 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68  ected even if th
10020 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  ey are still in 
10030 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  use..*/.static P
10040 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f  gHdr *pager_get_
10050 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
10060 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
10070 20 20 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69    PgHdr *p, *pLi
10080 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b  st;.  pList = 0;
10090 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
100a0 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
100b0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
100c0 28 20 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  ( p->dirty ){.  
100d0 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
100e0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c 69  pList;.      pLi
100f0 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  st = p;.    }.  
10100 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
10110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
10120 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  re a page..**.**
10130 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   A read lock on 
10140 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73  the disk file is
10150 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74   obtained when t
10160 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73  he first page is
10170 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54   acquired. .** T
10180 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  his read lock is
10190 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68   dropped when th
101a0 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  e last page is r
101b0 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eleased..**.** A
101c0 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20   _get works for 
101d0 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20  any page number 
101e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20  greater than 0. 
101f0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
10200 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c  .** file is smal
10210 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
10220 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65  uested page, the
10230 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b  n no actual disk
10240 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20  .** read occurs 
10250 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  and the memory i
10260 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  mage of the page
10270 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
10280 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e  to.** all zeros.
10290 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61    The extra data
102a0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
102b0 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
102c0 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20  itialized.** to 
102d0 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20  zeros the first 
102e0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
102f0 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
10300 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  y..**.** The acq
10310 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
10320 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
10330 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
10340 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
10350 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
10360 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10370 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
10380 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
10390 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
103a0 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
103b0 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
103c0 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75  utine and _looku
103d0 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
103e0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
103f0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
10400 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
10410 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
10420 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
10430 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
10440 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
10450 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
10460 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a  ereas _lookup().
10470 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
10480 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
10490 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
104a0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
104b0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
104c0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
104d0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
104e0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
104f0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
10500 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f  y..** Since _loo
10510 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
10520 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
10530 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
10540 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
10550 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
10560 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
10570 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50  er_get(Pager *pP
10580 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
10590 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b   void **ppPage){
105a0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
105b0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4d   int rc;..  /* M
105c0 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
105d0 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
105e0 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
105f0 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
10600 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
10610 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
10620 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
10630 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
10640 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45  Mask & ~(PAGER_E
10650 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20  RR_FULL) ){.    
10660 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
10670 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
10680 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
10690 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
106a0 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
106b0 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
106c0 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
106d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
106e0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
106f0 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 70 50 61  >nRef==0 && !pPa
10700 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
10710 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a    int busy = 1;.
10720 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
10730 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
10740 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  k(&pPager->fd, S
10750 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
10760 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
10770 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20  ITE_BUSY && .   
10780 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
10790 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a 20 20  syHandler && .  
107a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
107b0 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e  usyHandler->xFun
107c0 63 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  c && .        pP
107d0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
107e0 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65 72  er->xFunc(pPager
107f0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
10800 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20  pArg, busy++).  
10810 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
10820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10830 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10840 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
10850 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
10860 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49  HARED;..    /* I
10870 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
10880 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
10890 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
108a0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
108b0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
108c0 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
108d0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
108e0 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
108f0 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
10900 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
10910 65 4a 6f 75 72 6e 61 6c 20 26 26 20 0a 20 20 20  eJournal && .   
10920 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69       sqlite3OsFi
10930 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  leExists(pPager-
10940 3e 7a 4a 6f 75 72 6e 61 6c 29 20 26 26 0a 20 20  >zJournal) &&.  
10950 20 20 20 20 20 20 21 73 71 6c 69 74 65 33 4f 73        !sqlite3Os
10960 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
10970 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  k(&pPager->fd) .
10980 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 69 6e      ){.       in
10990 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a  t rc;..       /*
109a0 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
109b0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
109c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
109d0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
109e0 0a 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  .       ** impor
109f0 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
10a00 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
10a10 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
10a20 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
10a30 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
10a40 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
10a50 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
10a60 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
10a70 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  .       ** datab
10a80 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
10a90 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
10aa0 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
10ab0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
10ac0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
10ad0 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
10ae0 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
10af0 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
10b00 20 69 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62   it .       ** b
10b10 61 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a  ack..       ** .
10b20 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73         ** Becaus
10b30 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
10b40 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
10b50 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
10b60 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  d, the.       **
10b70 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
10b80 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
10b90 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
10ba0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
10bb0 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
10bc0 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49  it's own EXCLUSI
10bd0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
10be0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
10bf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
10c00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
10c10 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  k(&pPager->fd, E
10c20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
10c30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
10c40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10c50 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
10c60 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
10c70 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
10c80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
10c90 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
10ca0 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  K;.         retu
10cb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a  rn rc;.       }.
10cc0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
10cd0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
10ce0 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20  LUSIVE;..       
10cf0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
10d00 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
10d10 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
10d20 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
10d30 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e      ** we are un
10d40 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  able to open the
10d50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
10d60 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
10d70 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
10d80 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
10d90 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
10da0 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
10db0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
10dc0 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
10dd0 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
10de0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
10df0 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20  holds.       ** 
10e00 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f  a write lock, so
10e10 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
10e20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77  any chance of tw
10e30 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20  o or more.      
10e40 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70   ** processes op
10e50 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
10e60 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  l at the same ti
10e70 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  me..       */.  
10e80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10e90 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
10ea0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
10eb0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
10ec0 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
10ed0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
10ef0 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
10f00 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
10f10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
10f20 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
10f30 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  CK;.         ret
10f40 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
10f50 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
10f60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10f70 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
10f80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10f90 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
10fa0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
10fb0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
10fc0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
10fd0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
10fe0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10ff0 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  Hdr = 0;..      
11000 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
11010 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
11020 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
11030 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
11040 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
11050 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
11060 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
11070 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
11080 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
11090 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69  Pager);.       i
110a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
110b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74   ){.         ret
110c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d  urn rc;.       }
110d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
110e0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
110f0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70   /* Search for p
11100 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  age in cache */.
11110 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
11120 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
11130 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 50  gno);.    if( pP
11140 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
11150 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
11160 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
11170 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
11180 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
11190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
111a0 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
111b0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
111c0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
111d0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
111e0 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  */.    int h;.  
111f0 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b    pPager->nMiss+
11200 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
11210 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
11220 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65  >mxPage || pPage
11230 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20  r->pFirst==0 || 
11240 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
11250 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
11260 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20   a new page */. 
11270 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
11280 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
11290 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49 54  of(*pPg) + SQLIT
112a0 45 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  E_PAGE_SIZE .   
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
112d0 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
112e0 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->nExtra.      
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 20 20 20 20 20 20 2b 20 70 50 61 67 65 72          + pPager
11310 2d 3e 6d 65 6d 44 62 2a 73 69 7a 65 6f 66 28 50  ->memDb*sizeof(P
11320 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
11330 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
11340 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
11350 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
11360 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75           pager_u
11370 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
11380 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
11390 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
113a0 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
113b0 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  RR_MEM;.        
113c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
113d0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
113e0 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30     memset(pPg, 0
113f0 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b  , sizeof(*pPg));
11400 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
11410 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
11420 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
11430 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
11440 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66  ager), 0, sizeof
11450 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20  (PgHistory));.  
11460 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
11470 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
11480 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
11490 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
114a0 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67  pAll;.      pPag
114b0 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
114c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
114d0 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  age++;.    }else
114e0 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20  {.      /* Find 
114f0 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
11500 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
11510 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
11520 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  es not.      ** 
11530 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
11540 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
11550 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  he journal..    
11560 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d    */.      pPg =
11570 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
11580 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  ynced;..      /*
11590 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
115a0 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
115b0 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
115c0 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
115d0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f      ** on the jo
115e0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
115f0 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
11600 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
11610 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65 72 79   a.      ** very
11620 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
11630 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
11640 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
11650 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20  ut sometimes.   
11660 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62     ** it can't b
11670 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20 20 20  e helped..      
11680 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
11690 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
116a0 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
116b0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
116c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
116d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
116e0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
116f0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
11700 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11710 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
11720 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
11730 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
11740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
11750 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
11760 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
11770 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
11780 72 20 69 6e 74 6f 20 74 68 65 0a 09 20 20 2a 2a  r into the..  **
11790 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
117a0 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61  his is done to a
117b0 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79  void ever modify
117c0 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 09 20  ing a journal.. 
117d0 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
117e0 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
117f0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
11800 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 09  ages that have..
11810 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65    ** already bee
11820 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
11830 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61   database (in ca
11840 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73  se the header is
11850 0a 09 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77  ..  ** trashed w
11860 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
11870 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
11880 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
11890 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
118a0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
118b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
118c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
118d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0 );.          r
118e0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
118f0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
11900 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
11910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11920 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
11930 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
11940 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
11950 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
11960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11970 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
11980 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
11990 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
119a0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
119b0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  Ref==0 );..     
119c0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
119d0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
119e0 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
119f0 20 64 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f   dirty..      */
11a00 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
11a10 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
11a20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
11a30 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
11a40 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
11a50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
11a60 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
11a70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
11a80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
11a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11aa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
11ab0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
11ac0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
11ad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11ae0 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ERR;.        }. 
11af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
11b00 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d  ert( pPg->dirty=
11b10 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
11b20 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
11b30 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
11b40 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
11b50 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
11b60 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
11b70 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
11b80 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
11b90 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
11ba0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64       ** sqlite_d
11bb0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f  ont_rollback() o
11bc0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
11bd0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
11be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
11bf0 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63      ** It is nec
11c00 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69  essary to do thi
11c10 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  s because the pa
11c20 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  ge marked always
11c30 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a  Rollback.      *
11c40 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61  * might be reloa
11c50 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74  ded at a later t
11c60 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20  ime but at that 
11c70 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72  point we won't r
11c80 65 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a  emember.      **
11c90 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
11ca0 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
11cb0 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
11cc0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
11cd0 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
11ce0 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
11cf0 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
11d00 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20  re on out..     
11d10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
11d20 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
11d30 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  k ){.        pPa
11d40 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
11d50 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ack = 1;.      }
11d60 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e  ..      /* Unlin
11d70 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66  k the old page f
11d80 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
11d90 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74  t and the hash t
11da0 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  able.      */.  
11db0 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70      unlinkPage(p
11dc0 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
11dd0 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  r->nOvfl++;.    
11de0 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  }.    pPg->pgno 
11df0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  = pgno;.    if( 
11e00 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
11e10 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
11e20 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
11e30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
11e40 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28  ite3CheckMemory(
11e50 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
11e60 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20  al, pgno/8);.   
11e70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11e80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
11e90 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
11ea0 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
11eb0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
11ec0 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
11ed0 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  &7)))!=0;.      
11ee0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
11ef0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
11f00 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
11f10 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
11f20 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
11f30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11f40 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26  Pager->aInStmt &
11f50 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
11f60 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20  ger->stmtSize.  
11f70 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
11f80 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
11f90 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
11fa0 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20  no&7)))!=0 ){.  
11fb0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
11fc0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
11fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11fe0 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
11ff0 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  m_stmt_list(pPg)
12000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
12010 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
12020 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pPg->nRef = 1;. 
12030 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
12040 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
12050 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67  f++;.    h = pag
12060 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20  er_hash(pgno);. 
12070 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
12080 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
12090 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
120a0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
120b0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
120c0 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
120d0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
120e0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
120f0 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
12100 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
12110 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
12120 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12130 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
12140 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
12150 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
12160 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
12170 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
12180 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
12190 62 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74 65  bSize<0 ) sqlite
121a0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
121b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
121c0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
121d0 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  k!=0 ){.      sq
121e0 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
121f0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
12200 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pg));.      rc =
12210 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
12220 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65  Pager);.      re
12230 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
12240 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
12250 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20  bSize<(int)pgno 
12260 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
12270 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
12280 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41  g), 0, SQLITE_PA
12290 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65  GE_SIZE);.    }e
122a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
122b0 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
122c0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
122d0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
122e0 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
122f0 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
12300 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47  off_t)SQLITE_PAG
12310 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72  E_SIZE);.      r
12320 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
12330 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  d(&pPager->fd, P
12340 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
12350 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ), SQLITE_PAGE_S
12360 49 5a 45 29 3b 0a 20 20 20 20 20 20 54 52 41 43  IZE);.      TRAC
12370 45 32 28 22 46 45 54 43 48 20 70 61 67 65 20 25  E2("FETCH page %
12380 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  d\n", pPg->pgno)
12390 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
123a0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
123b0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
123c0 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  gno, 3);.      i
123d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
123e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   ){.        off_
123f0 74 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20  t fileSize;.    
12400 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f      if( sqlite3O
12410 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
12420 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29  r->fd,&fileSize)
12430 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  !=SQLITE_OK.    
12440 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69             || fi
12450 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 53 51 4c  leSize>=pgno*SQL
12460 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ITE_PAGE_SIZE ){
12470 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12480 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
12490 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
124a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
124b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
124c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
124d0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
124e0 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53  _DATA(pPg), 0, S
124f0 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
12500 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
12520 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
12530 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
12540 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
12550 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  e. */.    pPager
12560 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61  ->nHit++;.    pa
12570 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
12580 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48  .  *ppPage = PGH
12590 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
125a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
125b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
125c0 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
125d0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
125e0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
125f0 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
12600 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
12610 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
12620 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
12630 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
12640 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
12650 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
12660 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
12670 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e  ite3pager_get().
12680 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
12690 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
126a0 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
126b0 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
126c0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
126d0 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
126e0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
126f0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
12700 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
12710 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
12720 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
12730 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
12740 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
12750 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
12760 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
12770 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
12780 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ppened..*/.void 
12790 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f  *sqlite3pager_lo
127a0 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
127b0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
127c0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
127d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
127e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
127f0 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28  pgno!=0 );.  if(
12800 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
12810 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46   & ~(PAGER_ERR_F
12820 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ULL) ){.    retu
12830 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20  rn 0;.  }.  pPg 
12840 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
12850 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
12860 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74  if( pPg==0 ) ret
12870 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65  urn 0;.  page_re
12880 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
12890 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
128a0 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pg);.}../*.** Re
128b0 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
128c0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
128d0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
128e0 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
128f0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
12900 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
12910 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
12920 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
12930 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
12940 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
12950 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
12960 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
12970 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
12980 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
12990 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
129a0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
129b0 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
129c0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
129d0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
129e0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
129f0 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
12a00 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f  */.  pPg = DATA_
12a10 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
12a20 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
12a30 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d  nRef>0 );.  pPg-
12a40 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
12a50 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  FO(pPg);..  /* W
12a60 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
12a70 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
12a80 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
12a90 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
12aa0 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
12ab0 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
12ac0 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
12ad0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
12ae0 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
12af0 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61  *pPager;.    pPa
12b00 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
12b10 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
12b20 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70  tFree = 0;.    p
12b30 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
12b40 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20  pPager->pLast;. 
12b50 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
12b60 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
12b70 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
12b80 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
12b90 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
12ba0 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c  e = pPg;.    }el
12bb0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
12bc0 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a  ->pFirst = pPg;.
12bd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
12be0 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26  g->needSync==0 &
12bf0 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  & pPager->pFirst
12c00 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Synced==0 ){.   
12c10 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
12c20 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20  tSynced = pPg;. 
12c30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
12c40 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
12c50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12c60 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
12c70 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
12c80 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
12c90 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c  .    /* When all
12ca0 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65   pages reach the
12cb0 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20   freelist, drop 
12cc0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72  the read lock fr
12cd0 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  om.    ** the da
12ce0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
12cf0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
12d00 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65  nRef--;.    asse
12d10 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
12d20 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
12d30 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
12d40 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & !pPager->memDb
12d50 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
12d60 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12d70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12d80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12d90 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
12da0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
12db0 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
12dc0 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
12dd0 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
12de0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
12df0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
12e00 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
12e10 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12e20 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
12e30 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
12e40 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
12e50 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
12e60 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
12e70 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
12e80 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
12e90 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
12ea0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
12eb0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
12ec0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
12ed0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
12ee0 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 61 73  r->memDb );.  as
12ef0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
12f00 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
12f10 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
12f20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12f30 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Open==0 );.  ass
12f40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
12f50 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c  Journal );.  sql
12f60 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
12f70 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  unt(pPager);.  p
12f80 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
12f90 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
12fa0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
12fb0 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
12fc0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
12fd0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  al==0 ){.    sql
12fe0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
12ff0 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
13000 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
13010 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
13020 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
13030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13040 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
13050 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
13060 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  sive(pPager->zJo
13070 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
13080 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70  jfd,pPager->temp
13090 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  File);.  pPager-
130a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
130b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
130c0 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
130d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
130e0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
130f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
13100 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
13110 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
13120 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
13130 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73  urnal = 0;.    s
13140 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
13150 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
13160 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
13170 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
13180 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
13190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
131a0 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71  NTOPEN;.  }.  sq
131b0 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
131c0 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  tory(pPager->zDi
131d0 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72  rectory, &pPager
131e0 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72  ->jfd);.  pPager
131f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
13200 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
13210 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
13220 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
13230 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
13240 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
13250 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
13260 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
13270 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
13280 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
13290 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
132a0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
132b0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
132c0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
132d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
132e0 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
132f0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
13300 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
13310 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
13320 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13330 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
13340 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
13350 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
13360 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13370 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
13380 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
13390 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
133a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
133b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
133c0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
133d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
133e0 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  c;  .}../*.** Ac
133f0 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
13400 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
13410 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
13420 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
13430 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
13440 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
13450 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
13460 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
13470 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
13480 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
13490 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73  er_rollback() is
134a0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
134b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
134c0 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
134d0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
134e0 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73  pager_unref() is
134f0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76   called to on ev
13500 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ery outstanding 
13510 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
13520 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
13530 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
13540 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
13550 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66  any open page of
13560 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
13570 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20   file.  Nothing 
13580 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68  changes about th
13590 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75  e page - it is u
135a0 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a  sed merely to.**
135b0 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74   acquire a point
135c0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
135d0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73  structure and as
135e0 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72   proof that ther
135f0 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20  e is.** already 
13600 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
13610 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
13620 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61  ** The second pa
13630 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
13640 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  s how much space
13650 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73   in bytes to res
13660 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61  erve for a.** ma
13670 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13680 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74  e-name at the st
13690 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
136a0 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72  al when it is cr
136b0 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  eated..**.** A j
136c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
136d0 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73  pened if this is
136e0 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
136f0 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70   file.  For temp
13700 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20  orary.** files, 
13710 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74  the opening of t
13720 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13730 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
13740 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a  l there is an.**
13750 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
13760 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
13770 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rnal..**.** If t
13780 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
13790 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20  lready reserved 
137a0 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69  for writing, thi
137b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
137c0 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
137d0 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28  ite3pager_begin(
137e0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
137f0 20 64 75 6d 6d 79 5f 66 69 78 6d 65 29 7b 0a 20   dummy_fixme){. 
13800 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
13810 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
13820 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
13830 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
13840 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
13850 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
13860 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
13870 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13880 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
13890 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
138a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
138b0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
138c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
138d0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
138e0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
138f0 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
13900 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
13910 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
13920 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
13930 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
13940 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
13950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13960 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20   int busy = 1;. 
13970 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
13980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13990 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
139a0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
139b0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
139c0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
139d0 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 50  && .          pP
139e0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
139f0 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  er && .         
13a00 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
13a10 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20  ndler->xFunc && 
13a20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
13a30 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
13a40 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70  >xFunc(pPager->p
13a50 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72  BusyHandler->pAr
13a60 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20  g, busy++).     
13a70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
13a80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13a90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ab0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
13ac0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
13ad0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69        pPager->di
13ae0 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
13af0 20 20 20 20 54 52 41 43 45 32 28 22 54 52 41 4e      TRACE2("TRAN
13b00 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 70  SACTION %d\n", p
13b10 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
13b20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
13b30 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
13b40 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
13b50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13b60 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
13b70 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
13b80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13b90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13ba0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
13bb0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
13bc0 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
13bd0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
13be0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
13bf0 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
13c00 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
13c10 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
13c20 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
13c30 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
13c40 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
13c50 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
13c60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13c70 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
13c80 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
13c90 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
13ca0 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
13cb0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
13cc0 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
13cd0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
13ce0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
13cf0 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
13d00 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
13d10 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
13d20 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
13d30 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
13d40 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
13d50 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
13d60 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
13d70 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
13d80 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
13d90 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
13da0 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
13db0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13dc0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
13dd0 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
13de0 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
13df0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
13e00 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
13e10 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
13e20 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
13e30 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
13e40 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
13e50 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
13e60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
13e70 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
13e80 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
13e90 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
13ea0 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61  t() or sqlite3pa
13eb0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74  ger_rollback() t
13ec0 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69  o.** reset..*/.i
13ed0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
13ee0 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74  write(void *pDat
13ef0 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
13f00 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
13f10 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
13f20 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
13f30 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
13f40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
13f50 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
13f60 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
13f70 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
13f80 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
13f90 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
13fa0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
13fb0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
13fc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13fd0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
13fe0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
13ff0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
14000 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
14010 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
14020 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
14030 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
14040 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
14050 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
14060 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
14070 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70  t away..  */.  p
14080 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
14090 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
140a0 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53  nal && (pPg->inS
140b0 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  tmt || pPager->s
140c0 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a  tmtInUse==0) ){.
140d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
140e0 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20  yCache = 1;.    
140f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14100 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
14110 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
14120 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
14130 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
14140 62 65 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  be.  ** written 
14150 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
14160 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  on journal or th
14170 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e ckeckpoint jou
14180 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74  rnal.  ** or bot
14190 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72  h..  **.  ** Fir
141a0 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
141b0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
141c0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
141d0 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65  sts and.  ** cre
141e0 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
141f0 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  s not..  */.  as
14200 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
14210 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
14220 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  K );.  rc = sqli
14230 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70  te3pager_begin(p
14240 44 61 74 61 2c 20 30 29 3b 0a 20 20 69 66 28 20  Data, 0);.  if( 
14250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14260 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
14270 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
14280 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
14290 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
142a0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
142b0 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
142c0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
142d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
142e0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
142f0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
14300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
14320 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14330 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
14340 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  !pPager->useJour
14350 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  nal );.  pPager-
14360 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
14370 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  ..  /* The trans
14380 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
14390 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
143a0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
143b0 20 6f 72 20 61 6e 0a 20 20 2a 2a 20 45 58 43 4c   or an.  ** EXCL
143c0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
143d0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
143e0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
143f0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
14400 0a 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  .  ** the transa
14410 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
14420 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
14430 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a 2f 0a 20   already..  */. 
14440 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
14450 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
14460 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70  >useJournal || p
14470 50 61 67 65 72 2d 3e 6d 65 6d 44 62 29 20 29 7b  Pager->memDb) ){
14480 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50  .    if( (int)pP
14490 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
144a0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
144b0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b  .      int szPg;
144c0 0a 20 20 20 20 20 20 75 33 32 20 73 61 76 65 64  .      u32 saved
144d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
144e0 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
144f0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
14500 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
14510 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
14520 72 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  r);.        TRAC
14530 45 32 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67 65  E2("JOURNAL page
14540 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
14550 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  o);.        asse
14560 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
14570 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
14580 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
14590 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
145a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
145b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
145c0 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
145d0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
145e0 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47  pHist->pOrig, PG
145f0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
14600 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
14610 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
14620 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f         pPg->inJo
14630 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20  urnal = 1;.     
14640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14650 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 61 67 65  u32 cksum = page
14660 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
14670 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61  pPg->pgno, pData
14680 29 3b 0a 20 20 20 20 20 20 20 20 73 61 76 65 64  );.        saved
14690 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f   = *(u32*)PGHDR_
146a0 54 4f 5f 45 58 54 52 41 28 70 50 67 29 3b 0a 20  TO_EXTRA(pPg);. 
146b0 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69         store32bi
146c0 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 53  ts(cksum, pPg, S
146d0 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
146e0 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d  ;.        szPg =
146f0 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
14700 45 2b 38 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  E+8;.        sto
14710 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
14720 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
14730 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
14740 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
14750 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
14760 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14770 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
14780 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
14790 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a  ta)[-4], szPg);.
147a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
147b0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a  journalOff += sz
147c0 50 67 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  Pg;.        TRAC
147d0 45 33 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67 65  E3("JOURNAL page
147e0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
147f0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  n", pPg->pgno, p
14800 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
14810 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61         CODEC(pPa
14820 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
14830 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20  >pgno, 0);.     
14840 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f     *(u32*)PGHDR_
14850 54 4f 5f 45 58 54 52 41 28 70 50 67 29 20 3d 20  TO_EXTRA(pPg) = 
14860 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69  saved;.        i
14870 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
14890 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
148a0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
148b0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
148c0 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
148d0 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
148e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
148f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14900 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
14910 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14920 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
14930 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
14940 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
14950 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
14960 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
14970 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70  no&7);.        p
14980 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
14990 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
149a0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a          pPg->inJ
149b0 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
149c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
149d0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
149e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
149f0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
14a00 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
14a10 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
14a20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
14a30 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
14a40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14a50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14a60 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
14a70 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = !pPager->journ
14a80 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
14a90 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
14aa0 20 20 20 20 54 52 41 43 45 33 28 22 41 50 50 45      TRACE3("APPE
14ab0 4e 44 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  ND page %d needS
14ac0 79 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  ync=%d\n", pPg->
14ad0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
14ae0 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ync);.    }.    
14af0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
14b00 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  c ){.      pPage
14b10 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
14b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14b30 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
14b40 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
14b50 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
14b60 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a  s not in it,.  *
14b70 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
14b80 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
14b90 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
14ba0 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
14bb0 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  at.  ** the stat
14bc0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
14bd0 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
14be0 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
14bf0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
14c00 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
14c10 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
14c20 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
14c30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
14c40 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
14c50 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
14c60 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
14c70 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
14c80 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
14c90 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
14ca0 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
14cb0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
14cc0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  bSize );.    if(
14cd0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
14ce0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
14cf0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
14d00 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
14d10 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
14d20 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
14d30 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 48  t==0 );.      pH
14d40 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c  ist->pStmt = sql
14d50 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
14d60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
14d70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73  ;.      if( pHis
14d80 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
14d90 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
14da0 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54  ->pStmt, PGHDR_T
14db0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
14dc0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
14dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
14de0 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE2("STMT-JOURN
14df0 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  AL page %d\n", p
14e00 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  Pg->pgno);.    }
14e10 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72  else{.      stor
14e20 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e  e32bits(pPg->pgn
14e30 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20  o, pPg, -4);.   
14e40 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
14e50 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
14e60 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 72 63 20  o, 7);.      rc 
14e70 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
14e80 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
14e90 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34  ((char*)pData)-4
14ea0 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
14eb0 5a 45 2b 34 29 3b 0a 20 20 20 20 20 20 54 52 41  ZE+4);.      TRA
14ec0 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE2("STMT-JOURNA
14ed0 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  L page %d\n", pP
14ee0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
14ef0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
14f00 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
14f10 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
14f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14f30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
14f40 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
14f50 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ger);.        pP
14f60 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
14f70 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b   PAGER_ERR_FULL;
14f80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14f90 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
14fa0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
14fb0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ec++;.      asse
14fc0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
14fd0 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
14fe0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
14ff0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
15000 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
15010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
15020 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
15030 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  t(pPg);.  }..  /
15040 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
15050 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
15060 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
15070 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
15080 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  <(int)pPg->pgno 
15090 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
150a0 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
150b0 6f 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  o;.    if( !pPag
150c0 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61  er->memDb && pPa
150d0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
150e0 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
150f0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
15100 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
15110 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
15120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15130 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
15140 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
15150 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
15160 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
15170 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
15180 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
15190 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
151a0 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
151b0 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
151c0 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
151d0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
151e0 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
151f0 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65  te3pager_iswrite
15200 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61  able(void *pData
15210 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
15220 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
15230 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
15240 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a   pPg->dirty;.}..
15250 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
15260 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
15270 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
15280 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
15290 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
152a0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
152b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76   sqlite3pager_ov
152c0 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
152d0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
152e0 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
152f0 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
15300 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
15310 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
15320 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
15330 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
15340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15360 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
15370 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
15380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15390 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c     memcpy(pPage,
153a0 20 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50   pData, SQLITE_P
153b0 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
153c0 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
153d0 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
153e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
153f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
15400 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
15410 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
15420 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
15430 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
15440 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
15450 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70  ation on page "p
15460 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65  gno" back to the
15470 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
15480 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
15490 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
154a0 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
154b0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
154c0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
154d0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
154e0 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
154f0 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
15500 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
15510 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
15520 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
15530 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
15540 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
15550 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
15560 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
15570 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
15580 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
15590 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
155a0 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  * sqlite3pager_d
155b0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62  ont_rollback() b
155c0 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
155d0 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
155e0 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
155f0 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
15600 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
15610 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
15620 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
15630 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
15640 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
15650 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
15660 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
15670 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
15680 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70  alls to sqlite3p
15690 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
156a0 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
156b0 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
156c0 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
156d0 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
156e0 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
156f0 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
15700 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
15710 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
15720 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
15730 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
15740 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
15750 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
15760 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
15770 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
15780 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
15790 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
157a0 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
157b0 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
157c0 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
157d0 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
157e0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
157f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15800 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
15810 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e  used,.** the don
15820 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  t_rollback() rou
15830 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
15840 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
15850 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a   page contains.*
15860 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  * critical data,
15870 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
15880 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
15890 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  s rolled back in
158a0 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65   spite.** of the
158b0 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
158c0 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   call..*/.void s
158d0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
158e0 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  _write(Pager *pP
158f0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
15900 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
15910 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d  .  if( pPager->m
15920 65 6d 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 0a  emDb ) return;..
15930 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
15940 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
15950 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79  o);.  pPg->alway
15960 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
15970 20 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d   if( pPg && pPg-
15980 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66  >dirty ){.    if
15990 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
159a0 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
159b0 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
159c0 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
159d0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
159e0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
159f0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
15a00 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
15a10 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
15a20 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
15a30 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
15a40 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
15a50 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
15a60 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
15a70 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
15a80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15a90 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
15aa0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
15ab0 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
15ac0 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
15ad0 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
15ae0 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
15af0 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
15b00 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
15b10 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
15b20 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
15b30 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
15b40 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
15b50 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
15b60 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
15b70 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
15b80 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
15b90 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
15ba0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
15bb0 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
15bc0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
15bd0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
15be0 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
15bf0 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
15c00 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70  f %d\n", pgno, p
15c10 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
15c20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
15c30 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
15c40 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
15c50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
15c60 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
15c70 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
15c80 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
15c90 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
15ca0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
15cb0 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
15cc0 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
15cd0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
15ce0 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
15cf0 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
15d00 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
15d10 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
15d20 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ournal..*/.void 
15d30 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
15d40 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20  t_rollback(void 
15d50 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
15d60 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
15d70 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
15d80 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
15d90 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
15da0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
15db0 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e!=PAGER_EXCLUSI
15dc0 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  VE || pPager->jo
15dd0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72  urnalOpen==0 ) r
15de0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
15df0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
15e00 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61   || pPager->alwa
15e10 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
15e20 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65  ager->memDb ) re
15e30 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
15e40 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
15e50 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
15e60 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
15e70 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
15e80 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
15e90 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
15ea0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
15eb0 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
15ec0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
15ed0 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
15ee0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
15ef0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
15f00 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
15f10 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
15f20 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
15f30 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
15f40 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  ;.      page_add
15f50 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
15f60 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  g);.    }.    TR
15f70 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
15f80 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
15f90 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
15fa0 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
15fb0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
15fc0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21  ->stmtInUse && !
15fd0 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28  pPg->inStmt && (
15fe0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
15ff0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
16000 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16010 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
16020 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
16030 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
16040 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
16050 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
16060 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  t!=0 );.    pPag
16070 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
16080 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
16090 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
160a0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
160b0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
160c0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  }.}.../*.** Clea
160d0 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c  r a PgHistory bl
160e0 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ock.*/.static vo
160f0 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  id clearHistory(
16100 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
16110 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
16120 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20  pHist->pOrig);. 
16130 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
16140 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69  t->pStmt);.  pHi
16150 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20  st->pOrig = 0;. 
16160 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
16170 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  0;.}../*.** Comm
16180 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
16190 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
161a0 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
161b0 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
161c0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
161d0 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
161e0 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
161f0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
16200 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
16210 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
16220 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
16230 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
16240 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
16250 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
16260 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61  3pager_commit(Pa
16270 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
16280 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
16290 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
162a0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41  ger->errMask==PA
162b0 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
162c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
162d0 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
162e0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
162f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16300 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16310 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
16320 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16330 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
16340 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
16350 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
16360 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
16370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16380 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
16390 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
163a0 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
163b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
163c0 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f    }.  TRACE2("CO
163d0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67  MMIT %d\n", pPag
163e0 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28  er->fd.h);.  if(
163f0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
16400 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
16410 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
16420 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
16430 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
16440 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
16450 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
16460 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
16470 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
16480 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
16490 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
164a0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
164b0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
164c0 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
164d0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
164e0 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
164f0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
16500 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
16510 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
16520 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
16530 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
16540 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
16550 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
16560 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
16570 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
16580 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
16590 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
165a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
165b0 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
165c0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
165d0 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
165e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
165f0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
16600 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
16610 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
16620 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
16630 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
16640 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  f( pPager->dirty
16650 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Cache==0 ){.    
16660 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77  /* Exit early (w
16670 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65  ithout doing the
16680 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20   time-consuming 
16690 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
166a0 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66  calls).    ** if
166b0 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
166c0 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74   no changes to t
166d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
166e0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
166f0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
16700 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  c==0 );.    rc =
16710 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
16720 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
16730 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
16740 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
16750 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
16760 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
16770 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20  lOpen );.  rc = 
16780 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
16790 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  c(pPager, 0);.  
167a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
167b0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f  K ){.    goto co
167c0 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a  mmit_abort;.  }.
167d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
167e0 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
167f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
16800 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ze = -1;.  retur
16810 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  n rc;..  /* Jump
16820 20 68 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e   here if anythin
16830 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72  g goes wrong dur
16840 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
16850 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d  rocess..  */.com
16860 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20  mit_abort:.  rc 
16870 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  = sqlite3pager_r
16880 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
16890 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
168a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
168b0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
168c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
168d0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
168e0 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
168f0 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
16900 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
16910 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
16920 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
16930 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
16940 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
16950 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
16960 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
16970 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
16980 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16990 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
169a0 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
169b0 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
169c0 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
169d0 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
169e0 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50  otocol (SQLITE_P
169f0 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65  ROTOCOL) or unle
16a00 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
16a10 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
16a20 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
16a30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16a40 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
16a50 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
16a60 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
16a70 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
16a80 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
16a90 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
16aa0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
16ab0 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
16ac0 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
16ad0 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
16ae0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
16af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
16b00 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  r_rollback(Pager
16b10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
16b20 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52   rc;.  TRACE2("R
16b30 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70  OLLBACK %d\n", p
16b40 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
16b50 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
16b60 62 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  b ){.    PgHdr *
16b70 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
16b80 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
16b90 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
16ba0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
16bb0 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Hist;.      asse
16bc0 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f  rt( !p->alwaysRo
16bd0 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
16be0 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b  if( !p->dirty ){
16bf0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16c00 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
16c10 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
16c20 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
16c30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
16c40 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
16c50 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
16c60 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
16c70 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
16c80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
16c90 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
16ca0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
16cb0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
16cc0 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
16cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
16ce0 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
16cf0 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
16d00 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
16d10 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ize);.        TR
16d20 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 2d 50  ACE2("ROLLBACK-P
16d30 41 47 45 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67  AGE %d\n", p->pg
16d40 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  no);.      }else
16d50 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32  {.        TRACE2
16d60 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65  ("PAGE %d is cle
16d70 61 6e 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b  an\n", p->pgno);
16d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
16d90 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
16da0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72  t);.      p->dir
16db0 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ty = 0;.      p-
16dc0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
16dd0 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20        p->inStmt 
16de0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  = 0;.      p->pP
16df0 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65  revStmt = p->pNe
16e00 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20  xtStmt = 0;..   
16e10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
16e20 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
16e30 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
16e40 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44  niter(PGHDR_TO_D
16e50 41 54 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e  ATA(p), pPager->
16e60 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16e70 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 0a   }.      .    }.
16e80 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
16e90 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
16ea0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
16eb0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a  er->origDbSize;.
16ec0 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
16ed0 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
16ee0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
16ef0 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
16f00 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
16f10 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
16f20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16f30 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
16f40 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
16f50 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
16f60 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
16f70 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
16f80 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
16f90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
16fa0 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  = -1;.    return
16fb0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
16fc0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
16fd0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  =0 && pPager->er
16fe0 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52  rMask!=PAGER_ERR
16ff0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
17000 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
17010 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
17020 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
17030 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
17040 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
17050 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
17060 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
17070 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
17080 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
17090 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
170a0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
170b0 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
170c0 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  ger);.    rc2 = 
170d0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
170e0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
170f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17100 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
17110 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
17120 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
17130 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
17140 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
17150 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17160 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
17170 4f 52 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67  ORRUPT;.    pPag
17180 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
17190 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
171a0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
171b0 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72  dbSize = -1;.  r
171c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
171d0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
171e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
171f0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
17200 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
17210 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
17220 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
17230 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
17240 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17250 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c  3pager_isreadonl
17260 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
17270 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
17280 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
17290 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
172a0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
172b0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
172c0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
172d0 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73   *sqlite3pager_s
172e0 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
172f0 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
17300 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d  t a[9];.  a[0] =
17310 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
17320 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
17330 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
17340 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
17350 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
17360 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
17370 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
17380 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
17390 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36  ->errMask;.  a[6
173a0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
173b0 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
173c0 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
173d0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c   = pPager->nOvfl
173e0 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
173f0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
17400 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
17410 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
17420 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
17430 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
17440 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
17450 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
17460 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
17470 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
17480 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
17490 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
174a0 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
174b0 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
174c0 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
174d0 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
174e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
174f0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
17500 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72  stmt_begin(Pager
17510 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
17520 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d   rc;.  char zTem
17530 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
17540 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72  E_SIZE];.  asser
17550 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
17560 49 6e 55 73 65 20 29 3b 0a 20 20 54 52 41 43 45  InUse );.  TRACE
17570 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64  2("STMT-BEGIN %d
17580 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
17590 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
175a0 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ->memDb ){.    p
175b0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
175c0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
175d0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
175e0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
175f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17600 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  K;.  }.  if( !pP
17610 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17620 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
17630 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
17640 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
17650 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
17660 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
17670 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
17680 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
17690 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
176a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
176b0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
176c0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30  ager->aInStmt==0
176d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
176e0 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  sLock(&pPager->f
176f0 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
17700 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17710 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69  TE_NOMEM;.  }.#i
17720 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72  fndef NDEBUG.  r
17730 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
17740 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a  eSize(&pPager->j
17750 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d  fd, &pPager->stm
17760 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
17770 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
17780 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73  gin_failed;.  as
17790 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
177a0 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65  mtJSize == pPage
177b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
177c0 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72  .#endif.  pPager
177d0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50  ->stmtJSize = pP
177e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
177f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
17800 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
17810 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  bSize;.  pPager-
17820 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b  >stmtHdrOff = 0;
17830 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43  .  pPager->stmtC
17840 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
17850 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20  ksumInit;.  if( 
17860 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65  !pPager->stmtOpe
17870 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
17880 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
17890 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67  emp(zTemp, &pPag
178a0 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69  er->stfd);.    i
178b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
178c0 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
178d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
178e0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
178f0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
17900 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
17910 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
17920 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17930 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
17940 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
17950 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
17960 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
17970 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  e(pPager->aInStm
17980 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
17990 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  aInStmt = 0;.  }
179a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
179b0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
179c0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
179d0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
179e0 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  tmt_commit(Pager
179f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
17a00 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
17a10 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  se ){.    PgHdr 
17a20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
17a30 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43    TRACE2("STMT-C
17a40 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50 61  OMMIT %d\n", pPa
17a50 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
17a60 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
17a70 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Db ){.      sqli
17a80 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
17a90 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
17aa0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
17ab0 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
17ac0 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >stfd, 0); */.  
17ad0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
17ae0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
17af0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
17b00 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
17b10 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d    }.    for(pPg=
17b20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
17b30 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
17b40 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50        pNext = pP
17b50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
17b60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
17b70 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  >inStmt );.     
17b80 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
17b90 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
17ba0 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  evStmt = pPg->pN
17bb0 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
17bc0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
17bd0 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emDb ){.        
17be0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
17bf0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
17c00 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
17c10 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
17c20 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
17c30 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
17c40 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
17c50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
17c60 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
17c70 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
17c80 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
17c90 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
17ca0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
17cb0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
17cc0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
17cd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17ce0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
17cf0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
17d00 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
17d10 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
17d20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
17d30 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
17d40 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
17d50 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
17d60 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
17d70 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
17d80 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
17d90 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67  emDb ){.      Pg
17da0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
17db0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
17dc0 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
17dd0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  pPg->pNextStmt){
17de0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
17df0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
17e00 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
17e10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17e20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
17e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
17e40 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
17e50 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
17e60 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
17e70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
17e80 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
17e90 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
17ea0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
17eb0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
17ec0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17ed0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
17ee0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
17ef0 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72  ize;.      memor
17f00 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
17f10 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
17f20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
17f30 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
17f40 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
17f50 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
17f60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
17f70 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
17f80 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
17f90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17fa0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
17fb0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
17fc0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
17fd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17fe0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
17ff0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
18000 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
18010 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
18020 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50  pager_filename(P
18030 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
18040 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18050 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
18060 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
18070 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
18080 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
18090 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
180a0 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e 61  lite3pager_dirna
180b0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
180c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
180d0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a  er->zDirectory;.
180e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
180f0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
18100 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
18110 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
18120 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
18130 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  er_journalname(P
18140 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
18150 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18160 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
18170 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63  ** Set the codec
18180 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
18190 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
181a0 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a  ager_set_codec(.
181b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
181c0 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
181d0 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
181e0 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  no,int),.  void 
181f0 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20  *pCodecArg.){.  
18200 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
18210 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
18220 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70  r->pCodecArg = p
18230 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  CodecArg;.}../*.
18240 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18250 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
18260 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62  rement the datab
18270 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
18280 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72  counter,.** stor
18290 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66  ed at byte 24 of
182a0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
182b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
182c0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
182d0 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
182e0 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a  Pager){.  void *
182f0 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72 20 2a  pPage;.  PgHdr *
18300 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68  pPgHdr;.  u32 ch
18310 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20  ange_counter;.  
18320 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70  int rc;..  /* Op
18330 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
18340 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
18350 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  g. */.  rc = sql
18360 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
18370 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 29  ager, 1, &pPage)
18380 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18390 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
183a0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
183b0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
183c0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
183d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
183e0 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  n rc;..  /* Read
183f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
18400 75 65 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a  ue at byte 24. *
18410 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44 41 54  /.  pPgHdr = DAT
18420 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61 67 65  A_TO_PGHDR(pPage
18430 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  );.  change_coun
18440 74 65 72 20 3d 20 72 65 74 72 69 65 76 65 33 32  ter = retrieve32
18450 62 69 74 73 28 70 50 67 48 64 72 2c 20 32 34 29  bits(pPgHdr, 24)
18460 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
18470 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
18480 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
18490 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
184a0 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f  24. */.  change_
184b0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73 74 6f  counter++;.  sto
184c0 72 65 33 32 62 69 74 73 28 63 68 61 6e 67 65 5f  re32bits(change_
184d0 63 6f 75 6e 74 65 72 2c 20 70 50 67 48 64 72 2c  counter, pPgHdr,
184e0 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65   24);..  /* Rele
184f0 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
18500 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c  erence. */.  sql
18510 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
18520 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
18530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18540 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
18550 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
18560 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
18570 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
18580 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
18590 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
185a0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
185b0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
185c0 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
185d0 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
185e0 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
185f0 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
18600 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
18610 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
18620 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
18630 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
18640 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
18650 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
18660 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  es that the jour
18670 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61  nal is synced, a
18680 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77  ll dirty pages w
18690 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65  ritten.** to the
186a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
186b0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
186c0 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65  file synced. The
186d0 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
186e0 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  .** remains to c
186f0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
18700 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65  ction is to dele
18710 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
18720 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65  ile (or.** maste
18730 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
18740 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
18750 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
18760 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
18770 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
18780 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
18790 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
187a0 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
187b0 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63 61 6c  pager_sync() cal
187c0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
187d0 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65  3pager_sync(Page
187e0 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
187f0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
18800 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18810 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
18820 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
18830 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
18840 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
18850 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
18860 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
18870 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
18880 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
18890 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
188a0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
188b0 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
188c0 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  && !pPager->memD
188d0 62 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72  b && pPager->dir
188e0 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50  tyCache ){.    P
188f0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61  gHdr *pPg;.    a
18900 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
18910 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20  ournalOpen );.. 
18920 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65     /* If a maste
18930 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
18940 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
18950 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
18960 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
18970 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  al file, then no
18980 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
18990 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  d. This happens 
189a0 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a  when it is.    *
189b0 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20  * written, then 
189c0 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c  the process fail
189d0 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  s to upgrade fro
189e0 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20  m a RESERVED to 
189f0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
18a00 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65  IVE lock. The ne
18a10 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63  xt time the proc
18a20 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d  ess tries to com
18a30 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  mit the.    ** t
18a40 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d  ransaction the m
18a50 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76  -j name will hav
18a60 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
18a70 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
18a80 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
18a90 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  setMaster ){.   
18aa0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
18ab0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
18ac0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18ad0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18ae0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
18af0 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  it;.      rc = w
18b00 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
18b10 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
18b20 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
18b30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18b40 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
18b50 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
18b60 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
18b70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18b80 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
18b90 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20  c_exit;.    }.. 
18ba0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
18bb0 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
18bc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18bd0 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
18be0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
18bf0 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
18c00 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
18c10 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
18c20 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
18c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
18c40 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20  o sync_exit;..  
18c50 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
18c60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
18c70 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
18c80 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
18c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
18ca0 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ync(&pPager->fd)
18cb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
18cc0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
18cd0 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a  ER_SYNCED;.  }..
18ce0 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74  sync_exit:.  ret
18cf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64  urn rc;.}..#if d
18d00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
18d10 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
18d20 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
18d30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
18d40 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
18d50 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72  he file lock for
18d60 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
18d70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
18d80 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20  value is one of 
18d90 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f  NO_LOCK, SHARED_
18da0 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
18db0 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  OCK,.** PENDING_
18dc0 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49  LOCK, or EXCLUSI
18dd0 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20  VE_LOCK..*/.int 
18de0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63  sqlite3pager_loc
18df0 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50  kstate(Pager *pP
18e00 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 4f 53  ager){.#ifdef OS
18e10 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e 20 70  _TEST.  return p
18e20 50 61 67 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f  Pager->fd->fd.lo
18e30 63 6b 74 79 70 65 3b 0a 23 65 6c 73 65 0a 20 20  cktype;.#else.  
18e40 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
18e50 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6e 64  d.locktype;.#end
18e60 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  if.}.#endif..#if
18e70 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18e80 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
18e90 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
18ea0 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
18eb0 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
18ec0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
18ed0 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28  e3pager_refdump(
18ee0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
18ef0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
18f00 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
18f10 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
18f20 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
18f30 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
18f40 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
18f50 20 20 20 20 70 72 69 6e 74 66 28 22 50 41 47 45      printf("PAGE
18f60 20 25 33 64 20 61 64 64 72 3d 30 78 25 30 38 78   %3d addr=0x%08x
18f70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
18f80 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
18f90 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41  (int)PGHDR_TO_DA
18fa0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
18fb0 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
18fc0 66 0a                                            f.