/ Hex Artifact Content
Login

Artifact 65e1b2ed257567016cbc1777378322d9975dd9fd:


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: 31 20 32 30 30 34 2f 30 36 2f 32 35 20 30 38 3a  1 2004/06/25 08:
0360: 33 32 3a 32 36 20 64 61 6e 69 65 6c 6b 31 39 37  32:26 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 69 6e 74 20 73 65 63 74 6f 72 53  */.  int sectorS
2c20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2c30: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
2c40: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
2c50: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20  ollback */.  u8 
2c60: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
2c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c80: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2c90: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2ca0: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  to jrnl */.};../
2cb0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62  *.** These are b
2cc0: 69 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  its that can be 
2cd0: 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72  set in Pager.err
2ce0: 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  Mask..*/.#define
2cf0: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
2d00: 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77      0x01  /* a w
2d10: 72 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f  rite() failed */
2d20: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
2d30: 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32  RR_MEM      0x02
2d40: 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61    /* malloc() fa
2d50: 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  iled */.#define 
2d60: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20  PAGER_ERR_LOCK  
2d70: 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f     0x04  /* erro
2d80: 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  r in the locking
2d90: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65   protocol */.#de
2da0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43  fine PAGER_ERR_C
2db0: 4f 52 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a  ORRUPT  0x08  /*
2dc0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75   database or jou
2dd0: 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
2de0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
2df0: 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78  _ERR_DISK     0x
2e00: 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64  10  /* general d
2e10: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20  isk I/O error - 
2e20: 62 61 64 20 68 61 72 64 20 64 72 69 76 65 3f 20  bad hard drive? 
2e30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  */../*.** Journa
2e40: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
2e50: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
2e60: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
2e70: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
2e80: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
2e90: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
2ea0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
2eb0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
2ec0: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
2ed0: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
2ee0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
2ef0: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
2f00: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
2f10: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
2f20: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
2f30: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
2f40: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
2f50: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
2f60: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
2f70: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
2f80: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
2f90: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
2fa0: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
2fb0: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
2fc0: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
2fd0: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
2fe0: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
2ff0: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
3000: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
3010: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
3020: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
3030: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
3040: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
3050: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
3060: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
3070: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
3080: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
3090: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
30a0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
30b0: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
30c0: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
30d0: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
30e0: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
30f0: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
3100: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
3110: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
3120: 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f 50  and the SQLITE_P
3130: 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f  AGE_SIZE bytes o
3140: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
3150: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
3160: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
3170: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
3180: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
3190: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
31a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
31b0: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
31c0: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
31d0: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
31e0: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
31f0: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
3200: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
3210: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
3220: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
3230: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
3240: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
3250: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
3260: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
3270: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
3280: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
3290: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
32a0: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
32b0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
32c0: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
32d0: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
32e0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
32f0: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
3300: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
3310: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
3320: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
3330: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
3340: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
3350: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3360: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
3370: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
3380: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
3390: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
33a0: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
33b0: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
33c0: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
33d0: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
33e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
33f0: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
3400: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
3410: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
3420: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
3430: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
3440: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
3450: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
3460: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
3470: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
3480: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
3490: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
34a0: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
34b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
34c0: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
34d0: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
34e0: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
34f0: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
3500: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
3510: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
3520: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3530: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
3540: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
3550: 69 7a 65 29 0a 0a 23 64 65 66 69 6e 65 20 50 41  ize)..#define PA
3560: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  GER_SECTOR_SIZE 
3570: 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  512../*.** Page 
3580: 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f  number PAGER_MJ_
3590: 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73  PGNO is never us
35a0: 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  ed in an SQLite 
35b0: 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a  database (it is.
35c0: 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  ** reserved for 
35d0: 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61  working around a
35e0: 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69   windows/posix i
35f0: 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e  ncompatibility).
3600: 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69   It is.** used i
3610: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  n the journal to
3620: 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68   signify that th
3630: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
3640: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
3650: 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74  .** is devoted t
3660: 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74  o storing a mast
3670: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
3680: 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  - there are no m
3690: 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20  ore pages to.** 
36a0: 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63  roll back. See c
36b0: 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63  omments for func
36c0: 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72  tion writeMaster
36d0: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65  Journal() for de
36e0: 74 61 69 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tails..*/.#defin
36f0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
3700: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
3710: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
3720: 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  )../*.** Enable 
3730: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3740: 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65  tracking (for de
3750: 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a  bugging) here:.*
3760: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3770: 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72  TEST.  int pager
3780: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
3790: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
37a0: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
37b0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
37c0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
37d0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
37e0: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
37f0: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
3800: 20 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20    printf(.      
3810: 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64   "REFCNT: %4d ad
3820: 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25  dr=0x%08x nRef=%
3830: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e  d\n",.       p->
3840: 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52  pgno, (int)PGHDR
3850: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
3860: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
3870: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
3880: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
3890: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
38a0: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
38b0: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
38c0: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
38d0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
38e0: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
38f0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
3900: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
3910: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3920: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
3930: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
3940: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
3950: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
3960: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
3970: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
3980: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
3990: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
39a0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
39b0: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
39c0: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
39d0: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
39e0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
39f0: 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64  2bits(OsFile *fd
3a00: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
3a10: 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72  u32 res;.  int r
3a20: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
3a30: 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65 73  3OsRead(fd, &res
3a40: 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a  , sizeof(res));.
3a50: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3a60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  _OK ){.    unsig
3a70: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
3a80: 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26      memcpy(ac, &
3a90: 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73  res, 4);.    res
3aa0: 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c   = (ac[0]<<24) |
3ab0: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
3ac0: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
3ad0: 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  ];.  }.  *pRes =
3ae0: 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72   res;.  return r
3af0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
3b00: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
3b10: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
3b20: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
3b30: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
3b40: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
3b50: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
3b60: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
3b70: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
3b80: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
3b90: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
3ba0: 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75  d, u32 val){.  u
3bb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
3bc0: 34 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  4];.  ac[0] = (v
3bd0: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
3be0: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
3bf0: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
3c00: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
3c10: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
3c20: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72   val & 0xff;.  r
3c30: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
3c40: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
3c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
3c60: 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  the 32-bit integ
3c70: 65 72 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68  er 'val' into th
3c80: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
3c90: 64 20 62 79 20 70 61 67 65 20 68 65 61 64 65 72  d by page header
3ca0: 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65  .** 'p' at offse
3cb0: 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73  t 'offset'..*/.s
3cc0: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
3cd0: 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20  32bits(u32 val, 
3ce0: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
3cf0: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
3d00: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
3d10: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
3d20: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
3d30: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
3d40: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
3d50: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
3d60: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
3d70: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
3d80: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
3d90: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
3da0: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
3db0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
3dc0: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
3dd0: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
3de0: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
3df0: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
3e00: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
3e10: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
3e20: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
3e30: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
3e40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3e50: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
3e60: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
3e70: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
3e80: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
3e90: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
3ea0: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
3eb0: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
3ec0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
3ed0: 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  rt the bits in t
3ee0: 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  he pPager->errMa
3ef0: 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f  sk into an appro
3f00: 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20  prate.** return 
3f10: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
3f20: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64  int pager_errcod
3f30: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
3f40: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
3f50: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
3f60: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
3f70: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29  PAGER_ERR_LOCK )
3f80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3f90: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20  PROTOCOL;.  if( 
3fa0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
3fb0: 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  & PAGER_ERR_DISK
3fc0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
3fd0: 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70  E_IOERR;.  if( p
3fe0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
3ff0: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
4000: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
4010: 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61  _FULL;.  if( pPa
4020: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
4030: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20  AGER_ERR_MEM )  
4040: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4050: 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67  OMEM;.  if( pPag
4060: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4070: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
4080: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
4090: 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  RRUPT;.  return 
40a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  rc;.}../*.** Whe
40b0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
40c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
40d0: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
40e0: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
40f0: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
4100: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
4110: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
4120: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
4130: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
4140: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
4150: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4160: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d  teMalloc(). *pzM
4170: 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20  aster is.** set 
4180: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
4190: 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
41a0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
41b0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
41c0: 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a  * sqliteFree() *
41d0: 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  pzMaster..**.** 
41e0: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
41f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
4200: 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73  s present *pzMas
4210: 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
4220: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
4230: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
4240: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
4250: 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c  terJournal(OsFil
4260: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
4270: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
4280: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
4290: 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20 20  .  off_t szJ;.  
42a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
42b0: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
42c0: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
42d0: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
42e0: 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20  ..  *pzMaster = 
42f0: 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0;..  rc = sqlit
4300: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
4310: 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  nl, &szJ);.  if(
4320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
4330: 7c 20 73 7a 4a 3c 31 32 20 29 20 72 65 74 75 72  | szJ<12 ) retur
4340: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
4350: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e  lite3OsSeek(pJrn
4360: 6c 2c 20 73 7a 4a 2d 31 32 29 3b 0a 20 20 69 66  l, szJ-12);.  if
4370: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4380: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20  ) return rc;. . 
4390: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
43a0: 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20  (pJrnl, &len);. 
43b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
43c0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
43d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
43e0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
43f0: 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72  gic, 8);.  if( r
4400: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
4410: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
4420: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
4430: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
4440: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
4450: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
4460: 32 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  2-len);.  if( rc
4470: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
4480: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d  turn rc;..  *pzM
4490: 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29  aster = (char *)
44a0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
44b0: 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73  );.  if( !*pzMas
44c0: 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ter ){.    retur
44d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
44e0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
44f0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
4500: 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b  *pzMaster, len);
4510: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4520: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
4530: 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72  teFree(*pzMaster
4540: 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72  );.    *pzMaster
4550: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
4560: 20 72 63 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72   rc;.  }.   .  r
4570: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
4590: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45a0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
45b0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
45c0: 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a  undary where a.*
45d0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
45e0: 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20   may be read or 
45f0: 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a  written. Pager.j
4600: 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64  ournalOff is upd
4610: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
4620: 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74   new seek offset
4630: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
4640: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
4650: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75   512:.**.** Inpu
4660: 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20  t Offset        
4670: 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66        Output Off
4680: 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  set.** ---------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
46b0: 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  * 0             
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
46d0: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
46e0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
46f0: 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20  * 100           
4700: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
4710: 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20  ** 2000         
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
4730: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
4740: 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  int seekJournalH
4750: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
4760: 29 7b 0a 20 20 6f 66 66 5f 74 20 6f 66 66 73 65  ){.  off_t offse
4770: 74 20 3d 20 30 3b 0a 20 20 6f 66 66 5f 74 20 63  t = 0;.  off_t c
4780: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
4790: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
47a0: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
47b0: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
47c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
47d0: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
47e0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
47f0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
4800: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
4810: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
4820: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
4830: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
4840: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
4850: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4860: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
4870: 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65  urnalOff = offse
4880: 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  t;.  return sqli
4890: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
48a0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
48b0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a  journalOff);.}..
48c0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
48d0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
48e0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
48f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
4900: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
4910: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
4920: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
4930: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4940: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
4950: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
4960: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
4970: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
4980: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
4990: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
49a0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
49b0: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
49c0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
49d0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
49e0: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
49f0: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
4a00: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
4a10: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
4a20: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
4a30: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
4a40: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
4a50: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
4a60: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
4a70: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
4a80: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
4a90: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
4aa0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
4ab0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46  ournal..** .** F
4ac0: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
4ad0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29  NAL_HDR_SZ - 24)
4ae0: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
4af0: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
4b00: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
4b10: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
4b20: 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63 20  ger){..  int rc 
4b30: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
4b40: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
4b50: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
4b60: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
4b70: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
4b80: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
4b90: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  ( pPager->stmtHd
4ba0: 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70  rOff==0 ){.    p
4bb0: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
4bc0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
4bd0: 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70 50  nalHdr;.  }.  pP
4be0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
4bf0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
4c00: 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  SZ(pPager);..  /
4c10: 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a  * FIX ME: .  **.
4c20: 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f    ** Possibly fo
4c30: 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e  r a pager not in
4c40: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74   no-sync mode, t
4c50: 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63  he journal magic
4c60: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a   should not.  **
4c70: 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69   be written unti
4c80: 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64  l nRec is filled
4c90: 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e   in as part of n
4ca0: 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  ext syncJournal(
4cb0: 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ). .  **.  ** Ac
4cc0: 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65  tually maybe the
4cd0: 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68   whole journal h
4ce0: 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20  eader should be 
4cf0: 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
4d00: 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54  at.  ** point. T
4d10: 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e  hink about this.
4d20: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
4d30: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
4d40: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
4d50: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
4d60: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
4d70: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
4d80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
4d90: 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20  The nRec Field. 
4da0: 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e  0xFFFFFFFF for n
4db0: 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e  o-sync journals.
4dc0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69   */.    rc = wri
4dd0: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
4de0: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
4df0: 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66  oSync ? 0xffffff
4e00: 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ff : 0);.  }.  i
4e10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4e20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
4e30: 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68  andom check-hash
4e40: 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20   initialiser */ 
4e50: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64  .    sqlite3Rand
4e60: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
4e70: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
4e80: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
4e90: 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  Init);.    rc = 
4ea0: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
4eb0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
4ec0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
4ed0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
4ee0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
4ef0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
4f00: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  base size */.   
4f10: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
4f20: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
4f30: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
4f40: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
4f50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4f60: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
4f70: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
4f80: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
4f90: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
4fa0: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
4fb0: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
4fc0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
4fd0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
4fe0: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
4ff0: 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  tten successfull
5000: 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  y. Seek the jour
5010: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65  nal.  ** file de
5020: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
5030: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
5040: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
5050: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
5060: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5070: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
5080: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
5090: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
50a0: 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  -1);.    rc = sq
50b0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
50c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30  ager->jfd, "\000
50d0: 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ", 1);.  }.  ret
50e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
50f0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
5100: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
5110: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
5120: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
5130: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
5140: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
5150: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
5160: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
5170: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
5180: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
5190: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
51a0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
51b0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
51c0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
51d0: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
51e0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
51f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
5200: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
5210: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
5220: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
5230: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
5240: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
5250: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
5260: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
5270: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
5280: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
5290: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
52a0: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
52b0: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
52c0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
52d0: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
52e0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
52f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
5300: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
5310: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
5320: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
5330: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
5340: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
5350: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
5360: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
5370: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
5380: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
5390: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
53a0: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
53b0: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
53c0: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
53d0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
53e0: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
53f0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
5400: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5410: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
5420: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
5430: 20 6f 66 66 5f 74 20 6a 6f 75 72 6e 61 6c 53 69   off_t journalSi
5440: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
5450: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
5460: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
5470: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
5480: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
5490: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
54a0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
54b0: 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  /..  rc = seekJo
54c0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
54d0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
54e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  urn rc;..  if( p
54f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5500: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
5510: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
5520: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
5530: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
5540: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
5550: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
5560: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
5570: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
5580: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
5590: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
55a0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
55b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
55c0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
55d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
55e0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
55f0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
5600: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
5610: 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72   pNRec);.  if( r
5620: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
5630: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
5640: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
5650: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
5660: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
5670: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5680: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70   = read32bits(&p
5690: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53  Pager->jfd, pDbS
56a0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
56b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
56c0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
56d0: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
56e0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
56f0: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a  lue used by .  *
5700: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
5710: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
5720: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
5730: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a   journal was.  *
5740: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
5750: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
5760: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
5770: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
5780: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
5790: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
57a0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
57b0: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
57c0: 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73  .  ** of Pager.s
57d0: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
57e0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
57f0: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
5800: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
5810: 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72  ad32bits(&pPager
5820: 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
5830: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
5840: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5850: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
5860: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
5870: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5880: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
5890: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
58a0: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
58b0: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65  ournalOff);.  re
58c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
58d0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
58e0: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
58f0: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
5900: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5910: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
5920: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
5930: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  nt location..*/.
5940: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
5950: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
5960: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
5970: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
5980: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
5990: 6e 74 20 6c 65 6e 3b 20 0a 0a 20 20 69 66 28 20  nt len; ..  if( 
59a0: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
59b0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
59c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
59d0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
59e0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
59f0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
5a00: 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20  r);..  /* If in 
5a10: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
5a20: 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
5a30: 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
5a40: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
5a50: 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
5a60: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
5a70: 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
5a80: 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
5a90: 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
5aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
5ab0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
5ac0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
5ad0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
5ae0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b  ){.    rc = seek
5af0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
5b00: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
5b10: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5b20: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50  rn rc;.  }..  pP
5b30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5b40: 20 2b 3d 20 28 6c 65 6e 2b 31 36 29 3b 0a 0a 20   += (len+16);.. 
5b50: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
5b60: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
5b70: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
5b80: 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63  ager));.  if( rc
5b90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5ba0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
5bb0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
5bc0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  &pPager->jfd, zM
5bd0: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
5be0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5bf0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5c00: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
5c10: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
5c20: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
5c30: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5c40: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5c50: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
5c60: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
5c70: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
5c80: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
5c90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20  }../*.** Add or 
5cb0: 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72  remove a page fr
5cc0: 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  om the list of a
5cd0: 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ll pages that ar
5ce0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74  e in the.** stat
5cf0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
5d00: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b  *.** The Pager k
5d10: 65 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20  eeps a separate 
5d20: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68  list of pages th
5d30: 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
5d40: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   in.** the state
5d50: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ment journal.  T
5d60: 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71  his helps the sq
5d70: 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
5d80: 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74  commit().** rout
5d90: 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73  ine run MUCH fas
5da0: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
5db0: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
5dc0: 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20  ere are many.** 
5dd0: 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20  pages in memory 
5de0: 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61  but only a few a
5df0: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
5e00: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
5e10: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5e20: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
5e30: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
5e40: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
5e50: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
5e60: 69 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  if( pPg->inStmt 
5e70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
5e80: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  rt( pPg->pPrevSt
5e90: 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e  mt==0 && pPg->pN
5ea0: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
5eb0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
5ec0: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
5ed0: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70  ->pStmt ){.    p
5ee0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50  Pager->pStmt->pP
5ef0: 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  revStmt = pPg;. 
5f00: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53   }.  pPg->pNextS
5f10: 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53  tmt = pPager->pS
5f20: 74 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tmt;.  pPager->p
5f30: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50  Stmt = pPg;.  pP
5f40: 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d  g->inStmt = 1;.}
5f50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
5f60: 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
5f70: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
5f80: 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d  Pg){.  if( !pPg-
5f90: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
5fa0: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  ;.  if( pPg->pPr
5fb0: 65 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  evStmt ){.    as
5fc0: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76  sert( pPg->pPrev
5fd0: 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d  Stmt->pNextStmt=
5fe0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
5ff0: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
6000: 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  tStmt = pPg->pNe
6010: 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b  xtStmt;.  }else{
6020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
6030: 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d  ->pPager->pStmt=
6040: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
6050: 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d  >pPager->pStmt =
6060: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
6070: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
6080: 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20  pNextStmt ){.   
6090: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
60a0: 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  extStmt->pPrevSt
60b0: 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  mt==pPg );.    p
60c0: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
60d0: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
60e0: 70 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20  pPrevStmt;.  }. 
60f0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
6100: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  = 0;.  pPg->pPre
6110: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  vStmt = 0;.  pPg
6120: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  ->inStmt = 0;.}.
6130: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
6140: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
6150: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
6160: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
6170: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
6180: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
6190: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
61a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
61b0: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
61c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
61d0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
61e0: 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d  Hdr *p = pPager-
61f0: 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73  >aHash[pager_has
6200: 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c  h(pgno)];.  whil
6210: 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21  e( p && p->pgno!
6220: 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d  =pgno ){.    p =
6230: 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20   p->pNextHash;. 
6240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
6250: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
6260: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
6270: 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d  clear the in-mem
6280: 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73  ory cache.  This
6290: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73   routine.** sets
62a0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
62b0: 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20  e pager back to 
62c0: 77 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e  what it was when
62d0: 20 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a   it was first.**
62e0: 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75   opened.  Any ou
62f0: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
6300: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20  are invalidated 
6310: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61  and subsequent a
6320: 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63  ttempts.** to ac
6330: 63 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73  cess those pages
6340: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
6350: 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
6360: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
6370: 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
6380: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
6390: 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
63a0: 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  xt;.  for(pPg=pP
63b0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
63c0: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
63d0: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
63e0: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  extAll;.    sqli
63f0: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  teFree(pPg);.  }
6400: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
6410: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
6420: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
6430: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  0;.  pPager->pLa
6440: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
6450: 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65  ->pAll = 0;.  me
6460: 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
6470: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
6480: 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20  ager->aHash));. 
6490: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
64a0: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
64b0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
64c0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
64d0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
64e0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
64f0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  }.  sqlite3OsUnl
6500: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
6510: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61   NO_LOCK);.  pPa
6520: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
6530: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  ER_UNLOCK;.  pPa
6540: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
6550: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
6560: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
6570: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6580: 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  pen==0 );.}../*.
6590: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
65a0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
65b0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
65c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
65d0: 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53  pen and.** a RES
65e0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
65f0: 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
6600: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
6610: 6f 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a  outine releases.
6620: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
6630: 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65  lock and acquire
6640: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  s a SHARED lock 
6650: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54  in its place.  T
6660: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
6670: 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e  le is deleted an
6680: 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  d closed..**.** 
6690: 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b  TODO: Consider k
66a0: 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eeping the journ
66b0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72  al file open for
66c0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
66d0: 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69  ases..** This mi
66e0: 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
66f0: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
6700: 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68  nt on windows wh
6710: 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61  ere opening.** a
6720: 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65   file is an expe
6730: 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e  nsive operation.
6740: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6750: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
6760: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
6770: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
6780: 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
6790: 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 69 66 28  ->memDb );.  if(
67a0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
67b0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
67c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
67d0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
67e0: 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
67f0: 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
6800: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
6810: 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
6820: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
6830: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
6840: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
6850: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
6860: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6870: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
6880: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
6890: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61  r->jfd);.    pPa
68a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
68b0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
68c0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
68d0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
68e0: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
68f0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
6900: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
6910: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
6920: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
6930: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
6940: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
6950: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
6960: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
6970: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
6980: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
6990: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
69a0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
69b0: 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
69c0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
69d0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
69e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
69f0: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
6a00: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
6a10: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  nal==0 );.  }.  
6a20: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
6a30: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  &pPager->fd, SHA
6a40: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61  RED_LOCK);.  pPa
6a50: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
6a60: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61  ER_SHARED;.  pPa
6a70: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
6a80: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
6a90: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
6aa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
6ac0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
6ad0: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
6ae0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
6af0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
6b00: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
6b10: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
6b20: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
6b30: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
6b40: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
6b50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
6b60: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
6b70: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
6b80: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
6b90: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
6ba0: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
6bb0: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
6bc0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
6bd0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
6be0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
6bf0: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
6c00: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
6c10: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
6c20: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
6c30: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
6c40: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
6c50: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
6c60: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
6c70: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
6c80: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
6c90: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
6ca0: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
6cb0: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
6cc0: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
6cd0: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
6ce0: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
6cf0: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
6d00: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
6d10: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
6d20: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
6d30: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
6d40: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
6d50: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
6d60: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
6d70: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
6d80: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
6d90: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
6da0: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
6db0: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
6dc0: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
6dd0: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
6de0: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
6df0: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
6e00: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
6e10: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
6e20: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
6e30: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
6e40: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
6e50: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
6e60: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
6e70: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
6e80: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
6e90: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
6ea0: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
6eb0: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
6ec0: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
6ed0: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
6ee0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
6ef0: 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68  o pgno, const ch
6f00: 61 72 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  ar *aData){.  u3
6f10: 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
6f20: 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
6f30: 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
6f40: 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77  ageSize-200;.  w
6f50: 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
6f60: 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
6f70: 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
6f80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
6f90: 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ksum;.}../*.** R
6fa0: 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67  ead a single pag
6fb0: 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
6fc0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f  al file opened o
6fd0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
6fe0: 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62  r.** jfd.  Playb
6ff0: 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67  ack this one pag
7000: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43  e..**.** If useC
7010: 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73  ksum==0 it means
7020: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f   this journal do
7030: 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b  es not use check
7040: 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73  sums.  Checksums
7050: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64  .** are not used
7060: 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   in statement jo
7070: 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73  urnals because s
7080: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
7090: 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64  s do not.** need
70a0: 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65   to survive powe
70b0: 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73  r failures..*/.s
70c0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
70d0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
70e0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
70f0: 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e   OsFile *jfd, in
7100: 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69  t useCksum){.  i
7110: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
7120: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
7130: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
7140: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
7150: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
7160: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
7170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7180: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
7190: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
71a0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
71b0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
71c0: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
71d0: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
71e0: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
71f0: 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f  u8 aData[SQLITE_
7200: 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 20 2f 2a  PAGE_SIZE];   /*
7210: 20 53 74 6f 72 65 20 64 61 74 61 20 68 65 72 65   Store data here
7220: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 72 65 61 64   */..  rc = read
7230: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e  32bits(jfd, &pgn
7240: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
7250: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7260: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
7270: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26  te3OsRead(jfd, &
7280: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
7290: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
72a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
72b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
72c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
72d0: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
72e0: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
72f0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
7300: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
7310: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
7320: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
7330: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
7340: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
7350: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
7360: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
7370: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
7380: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
7390: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
73a0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
73b0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
73c0: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
73d0: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
73e0: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
73f0: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
7400: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
7410: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
7420: 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
7430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
7440: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
7450: 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  o>(unsigned)pPag
7460: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
7470: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7480: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73  OK;.  }.  if( us
7490: 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63  eCksum ){.    rc
74a0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
74b0: 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  d, &cksum);.    
74c0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
74d0: 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
74e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
74f0: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63  .    if( pager_c
7500: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e  ksum(pPager, pgn
7510: 6f 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  o, aData)!=cksum
7520: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7530: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
7540: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
7550: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
7560: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
7570: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
7580: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
7590: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
75a0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
75b0: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
75c0: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
75d0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
75e0: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
75f0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
7600: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
7610: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
7620: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
7630: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
7640: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
7650: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
7660: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
7670: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
7680: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
7690: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
76a0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
76b0: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
76c0: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
76d0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
76e0: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
76f0: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20  t dirty..  */.  
7700: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
7710: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
7720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
7730: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
7740: 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50  _EXCLUSIVE || pP
7750: 67 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22 50  g );.  TRACE2("P
7760: 4c 41 59 42 41 43 4b 20 70 61 67 65 20 25 64 5c  LAYBACK page %d\
7770: 6e 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  n", pgno);.  if(
7780: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
7790: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
77a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
77b0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
77c0: 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f  , (pgno-1)*(off_
77d0: 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  t)SQLITE_PAGE_SI
77e0: 5a 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ZE);.    rc = sq
77f0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
7800: 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c  ager->fd, aData,
7810: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
7820: 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  E);.  }.  if( pP
7830: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
7840: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
7850: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
7860: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
7870: 78 63 65 70 74 20 66 6f 72 20 70 61 67 65 0a 20  xcept for page. 
7880: 20 20 20 2a 2a 20 31 20 77 68 69 63 68 20 69 73     ** 1 which is
7890: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
78a0: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
78b0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
78c0: 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 61 63  tabase.    ** ac
78d0: 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
78e0: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
78f0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
7900: 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  Ref==0 || pPg->p
7910: 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 70 44  gno==1 );.    pD
7920: 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
7930: 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65  ATA(pPg);.    me
7940: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
7950: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
7960: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
7970: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
7980: 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d  r ){  /*** FIX M
7990: 45 3a 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20  E:  Should this 
79a0: 62 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f  be xReinit? ***/
79b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
79c0: 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
79d0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
79e0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
79f0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
7a00: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
7a10: 45 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  E ){.      pPg->
7a20: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
7a30: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
7a40: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 4f   0;.    }.    CO
7a50: 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
7a60: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
7a70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7a80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
7a90: 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
7aa0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
7ab0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7ac0: 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
7ad0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
7ae0: 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
7af0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7b00: 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
7b10: 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
7b20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7b30: 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
7b40: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
7b50: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
7b60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
7b70: 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
7b80: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  t is..**.** The 
7b90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7ba0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
7bb0: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68   names of all ch
7bc0: 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ild journals..**
7bd0: 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61   To tell if a ma
7be0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
7bf0: 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65   be deleted, che
7c00: 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68  ck to each of th
7c10: 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20  e.** children.  
7c20: 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  If all children 
7c30: 61 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69  are either missi
7c40: 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66  ng or do not ref
7c50: 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65  er to.** a diffe
7c60: 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  rent master jour
7c70: 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  nal, then this m
7c80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61  aster journal ca
7c90: 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  n be deleted..*/
7ca0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
7cb0: 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73  r_delmaster(cons
7cc0: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
7cd0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
7ce0: 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20  t master_open = 
7cf0: 30 3b 0a 20 20 4f 73 46 69 6c 65 20 6d 61 73 74  0;.  OsFile mast
7d00: 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73  er;.  char *zMas
7d10: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
7d20: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
7d30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7d40: 6c 65 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 6e 4d  le */.  off_t nM
7d50: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
7d60: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
7d70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
7d80: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
7d90: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7da0: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
7db0: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
7dc0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
7dd0: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
7de0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
7df0: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
7e00: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
7e10: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d  erence..  */.  m
7e20: 65 6d 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30  emset(&master, 0
7e30: 2c 20 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29  , sizeof(master)
7e40: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7e50: 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
7e60: 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65  (zMaster, &maste
7e70: 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  r, 0);.  if( rc!
7e80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
7e90: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
7ea0: 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  .  master_open =
7eb0: 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   1;.  rc = sqlit
7ec0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61  e3OsFileSize(&ma
7ed0: 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
7ee0: 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
7ef0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
7f00: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
7f10: 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72  ;..  if( nMaster
7f20: 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20  Journal>0 ){.   
7f30: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
7f40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
7f50: 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20  erPtr = 0;..    
7f60: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
7f70: 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
7f80: 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
7f90: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
7fa0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c      ** sqliteMal
7fb0: 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
7fc0: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
7fd0: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
7fe0: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
7ff0: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
8000: 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  iteMalloc(nMaste
8010: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69  rJournal);.    i
8020: 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
8030: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
8040: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8050: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
8060: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
8070: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8080: 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20 7a  sRead(&master, z
8090: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
80a0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
80b0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
80c0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
80d0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
80e0: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
80f0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
8100: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
8110: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
8120: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
8130: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
8140: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
8150: 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20  (zJournal) ){.  
8160: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
8170: 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
8180: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
8190: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
81a0: 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
81b0: 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
81c0: 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
81d0: 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
81e0: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
81f0: 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
8200: 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
8210: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8220: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
8230: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46    */.        OsF
8240: 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 0a 20 20  ile journal;..  
8250: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f        memset(&jo
8260: 75 72 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  urnal, 0, sizeof
8270: 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20  (journal));.    
8280: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8290: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a  OsOpenReadOnly(z
82a0: 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61  Journal, &journa
82b0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
82c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
82d0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
82e0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
82f0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
8300: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
8310: 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e 61  rJournal(&journa
8320: 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b  l, &zMasterPtr);
8330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8340: 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c  OsClose(&journal
8350: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
8360: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8370: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
8380: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
8390: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
83a0: 20 69 66 28 20 7a 4d 61 73 74 65 72 50 74 72 20   if( zMasterPtr 
83b0: 26 26 20 21 73 74 72 63 6d 70 28 7a 4d 61 73 74  && !strcmp(zMast
83c0: 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 20  erPtr, zMaster) 
83d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
83e0: 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
83f0: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
8400: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8410: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
8420: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
8430: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
8440: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
8450: 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74   zJournal += (st
8460: 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  rlen(zJournal)+1
8470: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
8480: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
8490: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c  e(zMaster);..del
84a0: 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66  master_out:.  if
84b0: 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( zMasterJournal
84c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
84d0: 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
84e0: 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
84f0: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20  master_open ){. 
8500: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8510: 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(&master);.  }.
8520: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8530: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79  /*.** Make every
8540: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
8550: 68 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68  he agree with wh
8560: 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20  at is on disk.  
8570: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
8580: 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69  ** reread the di
8590: 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  sk to reset the 
85a0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63  state of the cac
85b0: 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
85c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
85d0: 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63   after a rollbac
85e0: 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20  k in which some 
85f0: 6f 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63  of the dirty cac
8600: 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20  he.** pages had 
8610: 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
8620: 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20  en out to disk. 
8630: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
8640: 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63   back the.** cac
8650: 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  he content and t
8660: 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74  he easiest way t
8670: 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20  o do that is to 
8680: 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63  reread the old c
8690: 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66  ontent.** back f
86a0: 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f  rom the disk..*/
86b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
86c0: 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50  r_reload_cache(P
86d0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
86e0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
86f0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8700: 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  K;.  for(pPg=pPa
8710: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
8720: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
8730: 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  l){.    char zBu
8740: 66 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  f[SQLITE_PAGE_SI
8750: 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ZE];.    if( !pP
8760: 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69  g->dirty ) conti
8770: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e  nue;.    if( (in
8780: 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
8790: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
87a0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
87b0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
87c0: 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47  ->fd, SQLITE_PAG
87d0: 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 28 70  E_SIZE*(off_t)(p
87e0: 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20  Pg->pgno-1));.  
87f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8800: 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
8810: 66 64 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45  fd, zBuf, SQLITE
8820: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
8830: 20 20 20 54 52 41 43 45 32 28 22 52 45 46 45 54     TRACE2("REFET
8840: 43 48 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  CH page %d\n", p
8850: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
8860: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a   CODEC(pPager, z
8870: 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Buf, pPg->pgno, 
8880: 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  2);.      if( rc
8890: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
88a0: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
88b0: 74 28 7a 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  t(zBuf, 0, SQLIT
88c0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
88d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
88e0: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63  >nRef==0 || memc
88f0: 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54  mp(zBuf, PGHDR_T
8900: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c  O_DATA(pPg), SQL
8910: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  ITE_PAGE_SIZE) )
8920: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50  {.      memcpy(P
8930: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
8940: 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f  ), zBuf, SQLITE_
8950: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
8960: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
8970: 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
8980: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
8990: 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41  iter(PGHDR_TO_DA
89a0: 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
89b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
89c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
89d0: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
89e0: 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20  _EXTRA(pPg), 0, 
89f0: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
8a00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8a10: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
8a20: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
8a30: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
8a40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8a50: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
8a60: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
8a70: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
8a80: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
8a90: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
8aa0: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
8ab0: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
8ac0: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
8ad0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
8ae0: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
8af0: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
8b00: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
8b10: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
8b20: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
8b30: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
8b40: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
8b50: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
8b60: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
8b70: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
8b80: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
8b90: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
8ba0: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
8bb0: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
8bc0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
8bd0: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
8be0: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
8bf0: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
8c00: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
8c10: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
8c20: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
8c30: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
8c40: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
8c50: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
8c60: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
8c70: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
8c80: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
8c90: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
8ca0: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
8cb0: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
8cc0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
8cd0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
8ce0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
8cf0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
8d00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8d10: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
8d20: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
8d30: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
8d40: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
8d50: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
8d60: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
8d70: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
8d80: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
8d90: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
8da0: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
8db0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
8dc0: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
8dd0: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
8de0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
8df0: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
8e00: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
8e10: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
8e20: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
8e30: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
8e40: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
8e50: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
8e60: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
8e70: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
8e80: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
8e90: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
8ea0: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
8eb0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
8ec0: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
8ed0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
8ee0: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
8ef0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
8f00: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
8f10: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
8f20: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
8f30: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
8f40: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
8f50: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
8f60: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
8f70: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
8f80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
8f90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8fa0: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
8fb0: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
8fc0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
8fd0: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
8fe0: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
8ff0: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
9000: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
9010: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
9020: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
9030: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
9040: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
9050: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
9060: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
9070: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
9080: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
9090: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
90a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
90b0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
90c0: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
90d0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
90e0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
90f0: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
9100: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
9110: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
9120: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
9130: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
9140: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
9150: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
9160: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
9170: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
9180: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
9190: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
91a0: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
91b0: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
91c0: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
91d0: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
91e0: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
91f0: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
9200: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
9210: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
9220: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
9230: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
9240: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
9250: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
9260: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
9270: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
9280: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
9290: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
92a0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
92b0: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
92c0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
92d0: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
92e0: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
92f0: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
9300: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
9310: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
9320: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
9330: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
9340: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
9350: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
9360: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
9370: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
9380: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
9390: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
93a0: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
93b0: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
93c0: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
93d0: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
93e0: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
93f0: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
9400: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
9410: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
9420: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
9430: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
9440: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
9450: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
9460: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
9470: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
9480: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
9490: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
94a0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
94b0: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
94c0: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
94d0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
94e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
94f0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
9500: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
9510: 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20  off_t szJ;      
9520: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9530: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9540: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
9550: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
9560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9570: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
9580: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
9590: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95b0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
95c0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
95d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
95e0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
95f0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
9600: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
9630: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
9640: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
9650: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
9660: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
9670: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
9680: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
9690: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
96a0: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
96b0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
96c0: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
96d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
96e0: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
96f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
9700: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
9710: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
9720: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a  eSize(&pPager->j
9730: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
9740: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9750: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
9760: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
9770: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
9780: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
9790: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
97a0: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
97b0: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
97c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
97d0: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
97e0: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
97f0: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
9800: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
9810: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
9820: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
9830: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
9840: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
9850: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
9860: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
9870: 61 6c 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al(&pPager->jfd,
9880: 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73   &zMaster);.  as
9890: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
98a0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
98b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
98c0: 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c  (zMaster && !sql
98d0: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
98e0: 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20  (zMaster)) ){.  
98f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
9900: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
9910: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
9920: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
9930: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
9940: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
9950: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73  layback;.  }.  s
9960: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
9970: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
9980: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9990: 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  Off = 0;..  /* T
99a0: 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
99b0: 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
99c0: 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  the readJournalH
99d0: 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  dr() call return
99e0: 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  s.  ** SQLITE_DO
99f0: 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
9a00: 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77  r occurs. */.  w
9a10: 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20  hile( 1 ){..    
9a20: 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
9a30: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9a40: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
9a50: 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
9a60: 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
9a70: 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
9a80: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
9a90: 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
9aa0: 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
9ab0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
9ac0: 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
9ad0: 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66  rocess must of f
9ae0: 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
9af0: 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
9b00: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
9b10: 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
9b20: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
9b30: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
9b40: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
9b50: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
9b60: 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
9b70: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
9b80: 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
9b90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
9ba0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
9bb0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
9bd0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
9be0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
9bf0: 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
9c00: 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
9c10: 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
9c20: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
9c30: 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
9c40: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
9c50: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
9c60: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
9c70: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
9c80: 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
9c90: 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
9ca0: 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
9cb0: 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
9cc0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
9cd0: 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
9ce0: 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
9cf0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
9d00: 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
9d10: 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
9d20: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
9d30: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
9d40: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
9d50: 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
9d60: 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
9d70: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
9d80: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
9d90: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
9da0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
9db0: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
9dc0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
9dd0: 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
9de0: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
9df0: 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
9e00: 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73   it's original s
9e10: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
9e20: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
9e30: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
9e40: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
9e50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9e60: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
9e70: 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ze==0 || pPager-
9e80: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50  >origDbSize==mxP
9e90: 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g );.      rc = 
9ea0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
9eb0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  e(&pPager->fd, S
9ec0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
9ed0: 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a 20 20  (off_t)mxPg);.  
9ee0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9ef0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
9f00: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
9f10: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
9f20: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
9f30: 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
9f40: 20 20 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c 69      /* rc = sqli
9f50: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
9f60: 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41 4c 5f  r->jfd, JOURNAL_
9f70: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  HDR_SZ(pPager));
9f80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d   */.    if( rc!=
9f90: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
9fa0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
9fb0: 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72   .    /* Copy or
9fc0: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
9fd0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9fe0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
9ff0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
a000: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
a010: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
a020: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
a030: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
a040: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
a050: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
a060: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a070: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a080: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a090: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
a0a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a0b0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OK;.          pP
a0c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a0d0: 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
a0e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a0f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a100: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
a110: 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
a120: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a130: 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61  ..  /* Pages tha
a140: 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
a150: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
a160: 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e  al but never syn
a170: 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e  ced.  ** where n
a180: 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79 20 74  ot restored by t
a190: 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20  he loop above.  
a1a0: 57 65 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f  We have to resto
a1b0: 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61  re those.  ** pa
a1c0: 67 65 73 20 62 79 20 72 65 61 64 69 6e 67 20 74  ges by reading t
a1d0: 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  hem back from th
a1e0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
a1f0: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ase..  */.  asse
a200: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
a210: 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f 72 65 6c  K );.  pager_rel
a220: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
a230: 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
a240: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20  :.  if( zMaster 
a250: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
a260: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
a270: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
a280: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
a290: 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a  turn true,.    *
a2a0: 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
a2b0: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
a2c0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
a2d0: 72 6e 61 6c 2e 20 49 66 20 65 72 72 6f 72 73 20  rnal. If errors 
a2e0: 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 64 75  .    ** occur du
a2f0: 72 69 6e 67 20 74 68 69 73 20 70 72 6f 63 65 73  ring this proces
a300: 73 2c 20 69 67 6e 6f 72 65 20 74 68 65 6d 2e 0a  s, ignore them..
a310: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
a320: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a330: 20 20 20 20 20 20 70 61 67 65 72 5f 64 65 6c 6d        pager_delm
a340: 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a  aster(zMaster);.
a350: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a360: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
a370: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
a380: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
a390: 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
a3a0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
a3b0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
a3c0: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
a3d0: 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
a3e0: 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
a3f0: 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
a400: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
a410: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
a420: 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
a430: 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52  ent PAGER_SECTOR
a440: 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65  _SIZE.  ** value
a450: 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
a460: 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
a470: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
a480: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
a490: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41  >sectorSize = PA
a4a0: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  GER_SECTOR_SIZE;
a4b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a4c0: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
a4d0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
a4e0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
a4f0: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
a500: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
a510: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
a520: 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a  rnal but with.**
a530: 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69   a few extra twi
a540: 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  sts..**.**    (1
a550: 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  )  The number of
a560: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
a570: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
a580: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20  he start of.**  
a590: 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65         the state
a5a0: 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  ment is stored i
a5b0: 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  n pPager->stmtSi
a5c0: 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
a5d0: 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
a5e0: 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
a5f0: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
a600: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
a610: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61  ing back the sta
a620: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20  tement journal, 
a630: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  also.**         
a640: 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67  playback all pag
a650: 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  es of the transa
a660: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65  ction journal be
a670: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ginning.**      
a680: 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61     at offset pPa
a690: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a  ger->stmtJSize..
a6a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
a6b0: 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
a6c0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
a6d0: 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20  {.  off_t szJ;  
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6f0: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
a700: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 6f 66   journal */.  of
a710: 66 5f 74 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  f_t hdrOff;.  in
a720: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
a730: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a740: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
a750: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
a760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
a770: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
a780: 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
a790: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a7a0: 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
a7b0: 55 47 20 0a 20 20 7b 0a 20 20 20 20 6f 66 66 5f  UG .  {.    off_
a7c0: 74 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63  t os_szJ;.    rc
a7d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
a7e0: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
a7f0: 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20  d, &os_szJ);.   
a800: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a810: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
a820: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d      assert( szJ=
a830: 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23  =os_szJ );.  }.#
a840: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
a850: 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65  hdrOff to be the
a860: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 66   offset to the f
a870: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
a880: 64 65 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  der written.  **
a890: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
a8a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
a8b0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
a8c0: 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61  ile if no journa
a8d0: 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61  l.  ** header wa
a8e0: 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  s written..  */.
a8f0: 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65    hdrOff = pPage
a900: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20  r->stmtHdrOff;. 
a910: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a920: 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64  >fullSync || !hd
a930: 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68  rOff );.  if( !h
a940: 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72  drOff ){.    hdr
a950: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20  Off = szJ;.  }. 
a960: 20 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65   ..  /* Truncate
a970: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
a980: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
a990: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
a9a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
a9b0: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
a9c0: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
a9d0: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61 67  SIZE*(off_t)pPag
a9e0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20  er->stmtSize);. 
a9f0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
aa00: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
aa10: 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  ze;..  /* Figure
aa20: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
aa30: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
aa40: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
aa50: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
aa60: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  t( pPager->stmtI
aa70: 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e  nUse && pPager->
aa80: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
aa90: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
aaa0: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
aab0: 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65  ;.  nRec = pPage
aac0: 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a  r->stmtNRec;.  .
aad0: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
aae0: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
aaf0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
ab00: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
ab10: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
ab20: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
ab30: 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
ab40: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69  ment journal omi
ab50: 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f  ts checksums fro
ab60: 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f  m.  ** each reco
ab70: 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66  rd since power-f
ab80: 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20  ailure recovery 
ab90: 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  is not important
aba0: 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20   to statement.  
abb0: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ** journals..  *
abc0: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
abd0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
abe0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
abf0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
ac00: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
ac10: 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73  stfd, 0);.    as
ac20: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
ac30: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
ac40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ac50: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
ac60: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
ac70: 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65  /* Now roll some
ac80: 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d   pages back from
ac90: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
aca0: 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e   journal. Pager.
acb0: 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77  stmtJSize.  ** w
acc0: 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  as the size of t
acd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ace0: 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  when this statem
acf0: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c  ent was started,
ad00: 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68   so.  ** everyth
ad10: 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e  ing after that n
ad20: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
ad30: 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69  d back, either i
ad40: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
ad50: 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72  abase, the memor
ad60: 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68  y cache, or both
ad70: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
ad80: 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
ad90: 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64  hen Pager.stmtHd
ada0: 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73  rOff is the offs
adb0: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
adc0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
add0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
ade0: 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20   written during 
adf0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74  this statement t
ae00: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
ae10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
ae20: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
ae30: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  fd, pPager->stmt
ae40: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
ae50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ae60: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
ae70: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
ae80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ae90: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
aea0: 6d 74 4a 53 69 7a 65 3b 0a 20 20 77 68 69 6c 65  mtJSize;.  while
aeb0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
aec0: 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b  lOff < hdrOff ){
aed0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
aee0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
aef0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
af00: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
af10: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
af20: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
af30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
af40: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
af50: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
af60: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
af70: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
af80: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52 65  J ){.    u32 nRe
af90: 63 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  c;.    u32 dummy
afa0: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
afb0: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
afc0: 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64  , szJ, &nRec, &d
afd0: 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72  ummy);.    if( r
afe0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
aff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
b000: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
b010: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
b020: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
b030: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e     }.    for(i=n
b040: 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
b050: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b060: 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
b070: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
b080: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
b090: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
b0a0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
b0b0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
b0c0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
b0d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b0e0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
b0f0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
b100: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
b110: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
b120: 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
b130: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
b140: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b150: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
b160: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
b170: 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ERR_CORRUPT;.   
b180: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
b190: 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RUPT;.  }.  retu
b1a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b1b0: 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
b1c0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
b1d0: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
b1e0: 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
b1f0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
b200: 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61   number is the a
b210: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66  bsolute value of
b220: 20 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61   the mxPage para
b230: 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50  meter..** If mxP
b240: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
b250: 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67   the noSync flag
b260: 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e   is also set.  n
b270: 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a  oSync bypasses.*
b280: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
b290: 65 33 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65  e3OsSync().  The
b2a0: 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68   pager runs much
b2b0: 20 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53   faster with noS
b2c0: 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69  ync on,.** but i
b2d0: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
b2e0: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
b2f0: 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62  r there is an ab
b300: 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66  rupt power .** f
b310: 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61  ailure, the data
b320: 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20  base file might 
b330: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
b340: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a  consistent and.*
b350: 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73  * unrepairable s
b360: 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tate.  .*/.void 
b370: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
b380: 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  _cachesize(Pager
b390: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
b3a0: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
b3b0: 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50  age>=0 ){.    pP
b3c0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
b3d0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
b3e0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
b3f0: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
b400: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
b410: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
b420: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31  ager->noSync = 1
b430: 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d  ;.    mxPage = -
b440: 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66  mxPage;.  }.  if
b450: 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20  ( mxPage>10 ){. 
b460: 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
b470: 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65  e = mxPage;.  }e
b480: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
b490: 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20  >mxPage = 10;.  
b4a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
b4b0: 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
b4c0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
b4d0: 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
b4e0: 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
b4f0: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
b500: 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
b510: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
b520: 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
b530: 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
b540: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
b550: 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
b560: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
b570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
b580: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
b590: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
b5a0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
b5c0: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
b5d0: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
b5e0: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
b5f0: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
b600: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
b610: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
b620: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
b630: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
b640: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
b650: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
b660: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
b680: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
b690: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
b6a0: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
b6b0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
b6c0: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
b6d0: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
b6e0: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
b6f0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
b700: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
b710: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
b720: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
b730: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
b740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
b750: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
b760: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
b770: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
b780: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
b790: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
b7a0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
b7b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
b7c0: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
b7d0: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
b7e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
b7f0: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
b810: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
b820: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
b830: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
b840: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
b850: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
b860: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
b870: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
b880: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
b890: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
b8a0: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
b8b0: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
b8c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
b8d0: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
b8e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
b8f0: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
b900: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
b910: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
b920: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
b930: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
b940: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
b950: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
b960: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
b970: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
b980: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
b990: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
b9a0: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64   FULL=3..*/.void
b9b0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
b9c0: 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50  t_safety_level(P
b9d0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b9e0: 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67  t level){.  pPag
b9f0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
ba00: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
ba10: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
ba20: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
ba30: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
ba40: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
ba50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
ba60: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
ba70: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a  eedSync = 0;.}..
ba80: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
ba90: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72  porary file.  Wr
baa0: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
bab0: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e  the file into zN
bac0: 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75  ame.** (zName mu
bad0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 53  st be at least S
bae0: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
baf0: 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29  IZE bytes long.)
bb00: 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66    Write.** the f
bb10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
bb20: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
bb30: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
bb40: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
bb50: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
bb60: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
bb70: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
bb80: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
bb90: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
bba0: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
bbb0: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
bbc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
bbd0: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
bbe0: 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f  p(char *zFile, O
bbf0: 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e  sFile *fd){.  in
bc00: 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74  t cnt = 8;.  int
bc10: 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63   rc;.  do{.    c
bc20: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
bc30: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
bc40: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
bc50: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
bc60: 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66  clusive(zFile, f
bc70: 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28  d, 1);.  }while(
bc80: 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51   cnt>0 && rc!=SQ
bc90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
bca0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bcb0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
bcc0: 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
bcd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
bce0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
bcf0: 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
bd00: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
bd10: 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
bd20: 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
bd30: 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
bd40: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
bd50: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ll to sqlite3pag
bd60: 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20  er_get() and is 
bd70: 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
bd80: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
bd90: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
bda0: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70  d using sqlite3p
bdb0: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a  ager_unref()..**
bdc0: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
bdd0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
bde0: 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
bdf0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
be00: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
be10: 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
be20: 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
be30: 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
be40: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
be50: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
be60: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  t is closed..*/.
be70: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
be80: 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a  _open(.  Pager *
be90: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
bea0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
beb0: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
bec0: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
bed0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
bee0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
bef0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
bf00: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
bf10: 20 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20 20   mxPage,        
bf20: 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d        /* Max num
bf30: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
bf40: 20 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a   cache pages */.
bf50: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
bf60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
bf70: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
bf80: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
bf90: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
bfa0: 20 75 73 65 4a 6f 75 72 6e 61 6c 2c 20 20 20 20   useJournal,    
bfb0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f        /* TRUE to
bfc0: 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   use a rollback 
bfd0: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
bfe0: 66 69 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 20  file */.  void  
bff0: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 20 20 20  *pBusyHandler   
c000: 20 20 20 2f 2a 20 42 75 73 79 20 63 61 6c 6c 62     /* Busy callb
c010: 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ack */.){.  Page
c020: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68 61  r *pPager;.  cha
c030: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
c040: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65   = 0;.  int name
c050: 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64  Len;.  OsFile fd
c060: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
c070: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
c080: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
c090: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
c0a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
c0b0: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  Only = 0;.  char
c0c0: 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
c0d0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20  MPNAME_SIZE];.. 
c0e0: 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20   *ppPager = 0;. 
c0f0: 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20   memset(&fd, 0, 
c100: 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20 69  sizeof(fd));.  i
c110: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
c120: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
c130: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c140: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  MEM;.  }.  if( z
c150: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
c160: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
c170: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
c180: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
c190: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
c1a0: 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46  Db = 1;.      zF
c1b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
c1c0: 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a  liteStrDup("");.
c1d0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c1e0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
c1f0: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
c200: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
c210: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
c220: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
c230: 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  f( zFullPathname
c240: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c250: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
c260: 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74  adWrite(zFullPat
c270: 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61  hname, &fd, &rea
c280: 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a  dOnly);.      }.
c290: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
c2a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
c2b0: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54  ager_opentemp(zT
c2c0: 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a  emp, &fd);.    z
c2d0: 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70  Filename = zTemp
c2e0: 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e  ;.    zFullPathn
c2f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
c300: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
c310: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
c320: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c330: 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20  .      tempFile 
c340: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
c350: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
c360: 61 6d 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ame ){.    retur
c370: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
c380: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
c390: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
c3a0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66  qlite3OsClose(&f
c3b0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  d);.    sqliteFr
c3c0: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
c3d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
c3e0: 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20  ;.  }.  nameLen 
c3f0: 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61  = strlen(zFullPa
c400: 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65  thname);.  pPage
c410: 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r = sqliteMalloc
c420: 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  ( sizeof(*pPager
c430: 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20  ) + nameLen*3 + 
c440: 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  30 );.  if( pPag
c450: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  er==0 ){.    sql
c460: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
c470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
c480: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
c490: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c4a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
c4b0: 53 45 54 5f 50 41 47 45 52 28 70 50 61 67 65 72  SET_PAGER(pPager
c4c0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
c4d0: 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
c4e0: 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50  &pPager[1];.  pP
c4f0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
c500: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
c510: 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ename[nameLen+1]
c520: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
c530: 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
c540: 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c  zDirectory[nameL
c550: 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28  en+1];.  strcpy(
c560: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
c570: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
c580: 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  );.  strcpy(pPag
c590: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
c5a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
c5b0: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
c5c0: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
c5d0: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
c5e0: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
c5f0: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
c600: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
c610: 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70   = 0;.  strcpy(p
c620: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
c630: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
c640: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
c650: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
c660: 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e  strcpy(&pPager->
c670: 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e  zJournal[nameLen
c680: 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a  ], "-journal");.
c690: 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66    pPager->fd = f
c6a0: 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  d;.  pPager->jou
c6b0: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
c6c0: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
c6d0: 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20  al = useJournal 
c6e0: 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61  && !memDb;.  pPa
c6f0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
c700: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
c710: 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50  tInUse = 0;.  pP
c720: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
c730: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
c740: 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
c750: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
c760: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
c770: 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  E;.  pPager->stm
c780: 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  tSize = 0;.  pPa
c790: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
c7a0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50   0;.  pPager->nP
c7b0: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
c7c0: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
c7d0: 67 65 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a 20  ge>5 ? mxPage : 
c7e0: 31 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  10;.  pPager->st
c7f0: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
c800: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  CK;.  pPager->er
c810: 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  rMask = 0;.  pPa
c820: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
c830: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
c840: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
c850: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
c860: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
c870: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
c880: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
c890: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
c8a0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
c8b0: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
c8c0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
c8d0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
c8e0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a  irstSynced = 0;.
c8f0: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
c900: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
c910: 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a  Extra = nExtra;.
c920: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
c930: 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43  Size = PAGER_SEC
c940: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67  TOR_SIZE;.  pPag
c950: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
c960: 20 3d 20 28 42 75 73 79 48 61 6e 64 6c 65 72 20   = (BusyHandler 
c970: 2a 29 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  *)pBusyHandler;.
c980: 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
c990: 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
c9a0: 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
c9b0: 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  );.  *ppPager = 
c9c0: 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
c9d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c9e0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
c9f0: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
ca00: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
ca10: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
ca20: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
ca30: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
ca40: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
ca50: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
ca60: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
ca70: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
ca80: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
ca90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
caa0: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
cab0: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
cac0: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
cad0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
cae0: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
caf0: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70   result sqlite3p
cb00: 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a  ager_close().  .
cb10: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
cb20: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
cb30: 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  y sqlite3pager_u
cb40: 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nref()..*/.void 
cb50: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
cb60: 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  _destructor(Page
cb70: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
cb80: 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69  (*xDesc)(void*,i
cb90: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
cba0: 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44  xDestructor = xD
cbb0: 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  esc;.}../*.** Se
cbc0: 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  t the reinitiali
cbd0: 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  zer for this pag
cbe0: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
cbf0: 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  , the reinitiali
cc00: 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  zer.** is called
cc10: 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
cc20: 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63  t of a page in c
cc30: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
cc40: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
cc50: 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72  .** value as a r
cc60: 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62  esult of a rollb
cc70: 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61  ack.  The callba
cc80: 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d  ck gives higher-
cc90: 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e  level code.** an
cca0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
ccb0: 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52  restore the EXTR
ccc0: 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72  A section to agr
ccd0: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
cce0: 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74  ored.** page dat
ccf0: 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
cd00: 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e  e3pager_set_rein
cd10: 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
cd20: 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
cd30: 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b  it)(void*,int)){
cd40: 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
cd50: 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
cd60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
cd70: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
cd80: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
cd90: 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
cda0: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
cdb0: 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
cdc0: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
cdd0: 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
cde0: 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20  r){.  off_t n;. 
cdf0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
ce00: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
ce10: 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b  er->dbSize>=0 ){
ce20: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
ce30: 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a  er->dbSize;.  }.
ce40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
ce50: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
ce60: 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45  >fd, &n)!=SQLITE
ce70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
ce80: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
ce90: 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20  GER_ERR_DISK;.  
cea0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ceb0: 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41    n /= SQLITE_PA
cec0: 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 21  GE_SIZE;.  if( !
ced0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26  pPager->memDb &&
cee0: 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45   n==PENDING_BYTE
cef0: 2f 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  /SQLITE_PAGE_SIZ
cf00: 45 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  E ){.    n++;.  
cf10: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
cf20: 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
cf30: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OCK ){.    pPage
cf40: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
cf50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
cf60: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
cf70: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
cf80: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
cf90: 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
cfa0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
cfb0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
cfc0: 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
cfd0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
cfe0: 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
cff0: 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
d000: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
d010: 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
d020: 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
d030: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
d040: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
d050: 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
d060: 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
d070: 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
d080: 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
d090: 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
d0a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
d0b0: 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
d0c0: 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
d0d0: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
d0e0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
d0f0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
d100: 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
d110: 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
d120: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
d130: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
d140: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
d150: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
d160: 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
d170: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
d180: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
d190: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
d1a0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
d1b0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
d1c0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
d1d0: 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
d1e0: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
d1f0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
d200: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
d210: 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
d220: 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
d230: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
d240: 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
d250: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d260: 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
d270: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
d280: 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
d290: 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
d2a0: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
d2b0: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
d2c0: 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
d2d0: 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
d2e0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
d2f0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
d300: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
d310: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
d320: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
d330: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
d340: 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
d350: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
d360: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
d370: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
d380: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
d390: 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50   = pager_hash(pP
d3a0: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
d3b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
d3c0: 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20  ash[h]==pPg );. 
d3d0: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
d3e0: 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
d3f0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Hash;.  }.  pPg-
d400: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
d410: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
d420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d430: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
d440: 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e  o truncate an in
d450: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
d460: 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c  .  Delete.** all
d470: 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e   pages whose pgn
d480: 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  o is larger than
d490: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
d4a0: 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
d4b0: 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ced..** Referenc
d4c0: 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
d4d0: 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
d4e0: 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
d4f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
d500: 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61  emoryTruncate(Pa
d510: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d520: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
d530: 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
d540: 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
d550: 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
d560: 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
d570: 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
d580: 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
d590: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
d5a0: 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
d5b0: 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
d5c0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
d5d0: 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
d5e0: 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
d5f0: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
d600: 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
d610: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
d620: 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
d630: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
d640: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
d650: 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
d660: 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  ll;.      unlink
d670: 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
d680: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
d690: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
d6a0: 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
d6b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e   }.}../*.** Trun
d6c0: 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
d6d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
d6e0: 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
d6f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
d700: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
d710: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
d720: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
d730: 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
d740: 3e 64 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20  >dbSize<0 ){.   
d750: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
d760: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
d770: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
d780: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
d790: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
d7a0: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
d7b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
d7c0: 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
d7d0: 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  =(unsigned)pPage
d7e0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
d7f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d800: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  K;.  }.  if( pPa
d810: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
d820: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
d830: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
d840: 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
d850: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
d860: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d870: 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
d880: 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
d890: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d8a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
d8b0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
d8c0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26  ite3OsTruncate(&
d8d0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
d8e0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66  TE_PAGE_SIZE*(of
d8f0: 66 5f 74 29 6e 50 61 67 65 29 3b 0a 20 20 69 66  f_t)nPage);.  if
d900: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d910: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
d920: 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
d930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
d940: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
d950: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
d960: 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
d970: 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
d980: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
d990: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
d9a0: 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
d9b0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
d9c0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
d9d0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
d9e0: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
d9f0: 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
da00: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
da10: 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
da20: 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
da30: 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
da40: 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
da50: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
da60: 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
da70: 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
da80: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
da90: 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
daa0: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
dab0: 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  mp..*/.int sqlit
dac0: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61  e3pager_close(Pa
dad0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
dae0: 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
daf0: 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50  xt;.  switch( pP
db00: 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20  ager->state ){. 
db10: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
db20: 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SERVED:.    case
db30: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a   PAGER_SYNCED: .
db40: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45      case PAGER_E
db50: 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20  XCLUSIVE: {.    
db60: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
db70: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
db80: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
db90: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
dba0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
dbb0: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
dbc0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
dbd0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
dbe0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
dbf0: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
dc00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
dc10: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 48     case PAGER_SH
dc20: 41 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66  ARED: {.      if
dc30: 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
dc40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
dc50: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
dc60: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
dc70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dc80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
dc90: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
dca0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
dcb0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
dcc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
dcd0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
dce0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
dcf0: 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  t){.#ifndef NDEB
dd00: 55 47 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UG.    if( pPage
dd10: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
dd20: 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
dd30: 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
dd40: 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
dd50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
dd60: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
dd70: 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
dd80: 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
dd90: 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
dda0: 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
ddb0: 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
ddc0: 66 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  f.    pNext = pP
ddd0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
dde0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
ddf0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
de00: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
de10: 66 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  fd);.  assert( p
de20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
de30: 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65  en==0 );.  /* Te
de40: 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
de50: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
de60: 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
de70: 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
de80: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
de90: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
dea0: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
deb0: 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
dec0: 0a 20 20 43 4c 52 5f 50 41 47 45 52 28 70 50 61  .  CLR_PAGER(pPa
ded0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
dee0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d 28  er->zFilename!=(
def0: 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d  char*)&pPager[1]
df00: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
df10: 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  0 );  /* Cannot 
df20: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 73 71  happen */.    sq
df30: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
df40: 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
df50: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
df60: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
df70: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
df80: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
df90: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
dfa0: 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
dfb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dfc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
dfd0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
dfe0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
dff0: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
e000: 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  o sqlite3pager_p
e010: 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a  agenumber(void *
e020: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
e030: 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  *p = DATA_TO_PGH
e040: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  DR(pData);.  ret
e050: 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  urn p->pgno;.}..
e060: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72  /*.** The page_r
e070: 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ef() function in
e080: 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66  crements the ref
e090: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
e0a0: 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74   a page..** If t
e0b0: 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
e0c0: 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
e0d0: 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
e0e0: 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
e0f0: 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
e100: 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
e110: 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  eelist..**.** Fo
e120: 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65  r non-test syste
e130: 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69  ms, page_ref() i
e140: 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63  s a macro that c
e150: 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29  alls _page_ref()
e160: 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68  .** online of th
e170: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
e180: 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20  t is zero.  For 
e190: 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
e1a0: 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61  ge_ref().** is a
e1b0: 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73   real function s
e1c0: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65  o that we can se
e1d0: 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e  t breakpoints an
e1e0: 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73  d trace it..*/.s
e1f0: 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
e200: 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
e210: 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
e220: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
e230: 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
e240: 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
e250: 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
e260: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
e270: 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ==pPg->pPager->p
e280: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
e290: 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20       PgHdr *p = 
e2a0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
e2b0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26        while( p &
e2c0: 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
e2d0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
e2e0: 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e  e; }.      pPg->
e2f0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
e300: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  nced = p;.    }.
e310: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
e320: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
e330: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
e340: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
e350: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
e360: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
e370: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
e380: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
e390: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
e3a0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
e3b0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  ){.      pPg->pN
e3c0: 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
e3d0: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
e3e0: 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
e3f0: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
e400: 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
e410: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
e420: 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
e430: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
e440: 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52  pPg->nRef++;.  R
e450: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23  EFINFO(pPg);.}.#
e460: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
e470: 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  T.  static void 
e480: 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
e490: 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50  pPg){.    if( pP
e4a0: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
e4b0: 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50      _page_ref(pP
e4c0: 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
e4d0: 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b       pPg->nRef++
e4e0: 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28  ;.      REFINFO(
e4f0: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
e500: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
e510: 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50  age_ref(P)   ((P
e520: 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65  )->nRef==0?_page
e530: 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50  _ref(P):(void)(P
e540: 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69  )->nRef++).#endi
e550: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
e560: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
e570: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
e580: 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f  e.  The input po
e590: 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65  inter is.** a re
e5a0: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
e5b0: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  age data..*/.int
e5c0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
e5d0: 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  f(void *pData){.
e5e0: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
e5f0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
e600: 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  ta);.  page_ref(
e610: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
e620: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e630: 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
e640: 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  nal.  In other w
e650: 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
e660: 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
e670: 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
e680: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
e690: 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
e6a0: 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
e6b0: 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
e6c0: 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20  ** disk.  It is 
e6d0: 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69  not safe to modi
e6e0: 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  fy the original 
e6f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
e700: 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  til after.** the
e710: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
e720: 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68  n synced.  If th
e730: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
e740: 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ase is modified 
e750: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f  before.** the jo
e760: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
e770: 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c  and a power fail
e780: 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ure occurs, the 
e790: 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c  unsynced journal
e7a0: 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62  .** data would b
e7b0: 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f  e lost and we wo
e7c0: 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  uld be unable to
e7d0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c   completely roll
e7e0: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  back the.** data
e7f0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44  base changes.  D
e800: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
e810: 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a  on would occur..
e820: 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
e830: 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73  ine also updates
e840: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
e850: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
e860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
e870: 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f   (See comments o
e880: 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  n the pager_play
e890: 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  back() routine f
e8a0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
e8b0: 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49  formation.).** I
e8c0: 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20  f the sync mode 
e8d0: 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e  is FULL, two syn
e8e0: 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20  cs will occur.  
e8f0: 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20  First the whole 
e900: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79  journal.** is sy
e910: 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e  nced, then the n
e920: 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
e930: 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63  ated, then a sec
e940: 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e  ond sync occurs.
e950: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
e960: 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20  rary databases, 
e970: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69  we do not care i
e980: 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  f we are able to
e990: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74   rollback.** aft
e9a0: 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
e9b0: 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75  re, so sync occu
e9c0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rs..**.** This r
e9d0: 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
e9e0: 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64  e needSync field
e9f0: 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63   of every page c
ea00: 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a  urrent held in.*
ea10: 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  * memory..*/.sta
ea20: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
ea30: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
ea40: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
ea50: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ea60: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79  ITE_OK;..  /* Sy
ea70: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
ea80: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
ea90: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
eaa0: 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
eab0: 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
eac0: 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
ead0: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
eae0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
eaf0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
eb00: 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
eb10: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
eb20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
eb30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
eb40: 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
eb50: 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
eb60: 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d  c ); // noSync m
eb70: 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73  ight be set if s
eb80: 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20  ynchronous.     
eb90: 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f   ** was turned o
eba0: 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ff after the tra
ebb0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
ebc0: 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36  rted.  Ticket #6
ebd0: 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  15 */.#ifndef ND
ebe0: 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20  EBUG.      {.   
ebf0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
ec00: 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52  e the pPager->nR
ec10: 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72  ec counter we ar
ec20: 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73  e keeping agrees
ec30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
ec40: 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74   the nRec comput
ec50: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ed from the size
ec60: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
ec70: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
ec80: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 6a  .        off_t j
ec90: 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Sz;.        rc =
eca0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
ecb0: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
ecc0: 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
ecd0: 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
ece0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
ecf0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
ed00: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29  ournalOff==jSz )
ed10: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
ed20: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
ed30: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
ed40: 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
ed50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
ed60: 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
ed70: 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
ed80: 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
ed90: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
eda0: 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
edb0: 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
edc0: 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
edd0: 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
ede0: 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
edf0: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
ee00: 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
ee10: 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
ee20: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a   for rollback. .
ee30: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ee40: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
ee50: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
ee60: 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e       TRACE2("SYN
ee70: 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
ee80: 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
ee90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
eea0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
eeb0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
eec0: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
eed0: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
eee0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eef0: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
ef00: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
ef10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
ef20: 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
ef30: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
ef40: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
ef50: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
ef60: 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
ef70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
ef80: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
ef90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
efa0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
efb0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
efc0: 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lOff);.      }. 
efd0: 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e       TRACE2("SYN
efe0: 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
eff0: 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
f000: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f010: 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61  lite3OsSync(&pPa
f020: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
f030: 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
f040: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50  urn rc;.      pP
f050: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
f060: 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rted = 1;.    }.
f070: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
f080: 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Sync = 0;..    /
f090: 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64  * Erase the need
f0a0: 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65  Sync flag from e
f0b0: 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a  very page..    *
f0c0: 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  /.    for(pPg=pP
f0d0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
f0e0: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
f0f0: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
f100: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
f110: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
f120: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
f130: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
f140: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   }..#ifndef NDEB
f150: 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50  UG.  /* If the P
f160: 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
f170: 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
f180: 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
f190: 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75  ync.  ** flag mu
f1a0: 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72  st also be clear
f1b0: 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20   for all pages. 
f1c0: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69   Verify that thi
f1d0: 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74  s.  ** invariant
f1e0: 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   is true..  */. 
f1f0: 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70   else{.    for(p
f200: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
f210: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
f220: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
f230: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
f240: 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
f250: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
f260: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
f270: 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  ed==pPager->pFir
f280: 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  st );.  }.#endif
f290: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
f2a0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
f2b0: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63  list of pages (c
f2c0: 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20  onnected by the 
f2d0: 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
f2e0: 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65  nter) write.** e
f2f0: 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73  very one of thos
f300: 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74  e pages out to t
f310: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f320: 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61   and mark them a
f330: 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a  ll.** as clean..
f340: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
f350: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
f360: 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29  st(PgHdr *pList)
f370: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
f380: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  r;.  int rc;.  i
f390: 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 0a 20 20  nt busy = 1;..  
f3a0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
f3b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f3c0: 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73  .  pPager = pLis
f3d0: 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  t->pPager;..  /*
f3e0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
f3f0: 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68  here may be eith
f400: 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  er a RESERVED or
f410: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
f420: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
f430: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
f440: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
f450: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
f460: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
f470: 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
f480: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72  lite3OsLock() ar
f490: 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20  e no-ops..  **. 
f4a0: 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
f4b0: 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
f4c0: 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
f4d0: 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
f4e0: 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
f4f0: 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
f500: 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
f510: 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
f520: 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
f530: 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
f540: 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
f550: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
f560: 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
f570: 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
f580: 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
f590: 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
f5a0: 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
f5b0: 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
f5c0: 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
f5d0: 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
f5e0: 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
f5f0: 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
f600: 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
f610: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
f620: 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
f630: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
f640: 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
f650: 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
f660: 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
f670: 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
f680: 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
f690: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
f6a0: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
f6b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
f6c0: 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
f6d0: 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
f6e0: 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
f6f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f700: 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
f710: 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
f720: 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
f730: 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
f740: 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
f750: 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 73   do {.    rc = s
f760: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
f770: 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
f780: 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 77 68  IVE_LOCK);.  }wh
f790: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
f7a0: 42 55 53 59 20 26 26 20 0a 20 20 20 20 20 20 70  BUSY && .      p
f7b0: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
f7c0: 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20 70 50  ler && .      pP
f7d0: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
f7e0: 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20  er->xFunc && .  
f7f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
f800: 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28  yHandler->xFunc(
f810: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
f820: 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79  dler->pArg, busy
f830: 2b 2b 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ++).  );.  if( r
f840: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f850: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f860: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61   }.  pPager->sta
f870: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
f880: 53 49 56 45 3b 0a 0a 20 20 77 68 69 6c 65 28 20  SIVE;..  while( 
f890: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
f8a0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
f8b0: 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  y );.    sqlite3
f8c0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
f8d0: 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
f8e0: 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54  -1)*(off_t)SQLIT
f8f0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
f900: 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
f910: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
f920: 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
f930: 6f 2c 20 36 29 3b 0a 20 20 20 20 54 52 41 43 45  o, 6);.    TRACE
f940: 32 28 22 53 54 4f 52 45 20 70 61 67 65 20 25 64  2("STORE page %d
f950: 5c 6e 22 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  \n", pList->pgno
f960: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
f970: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
f980: 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
f990: 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 53 51  _DATA(pList), SQ
f9a0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
f9b0: 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65  .    CODEC(pPage
f9c0: 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
f9d0: 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
f9e0: 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66  pgno, 0);.    if
f9f0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
fa00: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72  ;.    pList->dir
fa10: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73  ty = 0;.    pLis
fa20: 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
fa30: 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
fa40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
fa50: 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
fa60: 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
fa70: 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
fa80: 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
fa90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
faa0: 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
fab0: 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
fac0: 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
fad0: 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
fae0: 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
faf0: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
fb00: 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
fb10: 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
fb20: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
fb30: 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69  p, *pList;.  pLi
fb40: 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  st = 0;.  for(p=
fb50: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
fb60: 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
fb70: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74  .    if( p->dirt
fb80: 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44  y ){.      p->pD
fb90: 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20  irty = pList;.  
fba0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20      pList = p;. 
fbb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
fbc0: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
fbd0: 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
fbe0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
fbf0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
fc00: 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
fc10: 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
fc20: 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
fc30: 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
fc40: 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
fc50: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
fc60: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
fc70: 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72  **.** A _get wor
fc80: 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ks for any page 
fc90: 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
fca0: 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64  han 0.  If the d
fcb0: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
fcc0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
fcd0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
fce0: 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75  ge, then no actu
fcf0: 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  al disk.** read 
fd00: 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d  occurs and the m
fd10: 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
fd20: 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  he page is initi
fd30: 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c  alized to.** all
fd40: 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74   zeros.  The ext
fd50: 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
fd60: 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
fd70: 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
fd80: 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  .** to zeros the
fd90: 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
fda0: 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
fdb0: 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  o memory..**.** 
fdc0: 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
fdd0: 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
fde0: 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
fdf0: 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
fe00: 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
fe10: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
fe20: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
fe30: 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
fe40: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
fe50: 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  so sqlite3pager_
fe60: 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  lookup().  Both 
fe70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
fe80: 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d   _lookup() attem
fe90: 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
fea0: 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
feb0: 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
fec0: 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
fed0: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
fee0: 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
fef0: 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
ff00: 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
ff10: 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f  t in whereas _lo
ff20: 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
ff30: 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
ff40: 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
ff50: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
ff60: 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
ff70: 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
ff80: 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
ff90: 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
ffa0: 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
ffb0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
ffc0: 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76  ce _lookup() nev
ffd0: 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
ffe0: 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
fff0: 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
10000 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
10010 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
10020 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 50 61  ite3pager_get(Pa
10030 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
10040 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70  o pgno, void **p
10050 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  pPage){.  PgHdr 
10060 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
10070 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
10080 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
10090 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
100a0 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
100b0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
100c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
100d0 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
100e0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
100f0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
10100 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
10110 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
10120 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
10130 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
10140 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
10150 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
10160 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
10170 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
10180 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
10190 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
101a0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
101b0 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  && !pPager->memD
101c0 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 75 73  b ){.    int bus
101d0 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f 20 7b 0a  y = 1;.    do {.
101e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
101f0 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
10200 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
10210 4b 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  K);.    }while( 
10220 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
10230 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
10240 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
10250 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
10260 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
10270 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20  r->xFunc && .   
10280 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
10290 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63  syHandler->xFunc
102a0 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
102b0 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73  ndler->pArg, bus
102c0 79 2b 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  y++).    );.    
102d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
102e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
102f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10300 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
10310 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20  PAGER_SHARED;.. 
10320 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
10330 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
10340 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
10350 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
10360 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
10370 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
10380 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
10390 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
103a0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
103b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
103c0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
103d0 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  && .        sqli
103e0 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
103f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
10400 29 20 26 26 0a 20 20 20 20 20 20 20 20 21 73 71  ) &&.        !sq
10410 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
10420 72 76 65 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  rvedLock(&pPager
10430 2d 3e 66 64 29 20 0a 20 20 20 20 29 7b 0a 20 20  ->fd) .    ){.  
10440 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20       int rc;..  
10450 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
10460 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
10470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10480 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
10490 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a  t it is.       *
104a0 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
104b0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
104c0 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
104d0 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
104e0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43  he.       ** EXC
104f0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
10500 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
10510 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
10520 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a  pen the.       *
10530 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
10540 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
10550 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
10560 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
10570 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  .       ** datab
10580 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
10590 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
105a0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
105b0 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20  rolling it .    
105c0 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
105d0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a     ** .       **
105e0 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
105f0 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
10600 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
10610 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
10620 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
10630 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
10640 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
10650 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
10660 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20  il to.       ** 
10670 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20  obtain it's own 
10680 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
10690 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
106a0 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ile..       */. 
106b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
106c0 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
106d0 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
106e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66  LOCK);.       if
106f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10700 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
10710 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
10720 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
10730 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  );.         pPag
10740 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
10750 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
10760 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
10780 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
10790 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a  GER_EXCLUSIVE;..
107a0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
107b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
107c0 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65  eading only.  Re
107d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
107e0 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65   if.       ** we
107f0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f   are unable to o
10800 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
10810 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a  file. .       **
10820 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  .       ** The j
10830 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
10840 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
10850 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20  locked itself.  
10860 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f  The.       ** jo
10870 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
10880 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20  ver open unless 
10890 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
108a0 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20  e file holds.   
108b0 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
108c0 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
108d0 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
108e0 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
108f0 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  .       ** proce
10900 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65  sses opening the
10910 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20   journal at the 
10920 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20  same time..     
10930 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
10940 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
10950 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a  adOnly(pPager->z
10960 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
10970 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69  ->jfd);.       i
10980 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   ){.         sql
109a0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
109b0 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
109c0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61  K);.         pPa
109d0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
109e0 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  ER_UNLOCK;.     
109f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10a00 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d  E_BUSY;.       }
10a10 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
10a20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
10a30 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
10a40 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
10a50 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
10a60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10a70 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  0;.       pPager
10a80 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
10a90 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
10aa0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
10ab0 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62  .       /* Playb
10ac0 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
10ad0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
10ae0 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
10af0 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c  rite.       ** l
10b00 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
10b10 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
10b20 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
10b30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
10b40 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
10b50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10b70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10b80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10b90 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
10ba0 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  se{.    /* Searc
10bb0 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61  h for page in ca
10bc0 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  che */.    pPg =
10bd0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
10be0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
10bf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
10c00 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  Db && pPager->st
10c10 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
10c20 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
10c30 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
10c40 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
10c50 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
10c60 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
10c70 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10c80 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
10c90 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
10ca0 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  t h;.    pPager-
10cb0 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66  >nMiss++;.    if
10cc0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
10cd0 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
10ce0 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
10cf0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d  ==0 || pPager->m
10d00 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  emDb ){.      /*
10d10 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
10d20 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20  ge */.      pPg 
10d30 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
10d40 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20  w( sizeof(*pPg) 
10d50 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  + SQLITE_PAGE_SI
10d60 5a 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ZE .            
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
10d90 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
10da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
10dc0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 2a 73   pPager->memDb*s
10dd0 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
10de0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
10df0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
10e00 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
10e10 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Db ){.          
10e20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
10e30 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
10e40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
10e50 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
10e60 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20  PAGER_ERR_MEM;. 
10e70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10e80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10e90 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
10ea0 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pPg, 0, sizeof(
10eb0 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66  *pPg));.      if
10ec0 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
10ed0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
10ee0 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  t(PGHDR_TO_HIST(
10ef0 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
10f00 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72   sizeof(PgHistor
10f10 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  y));.      }.   
10f20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
10f30 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70   pPager;.      p
10f40 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
10f50 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
10f60 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
10f70 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61  = pPg;.      pPa
10f80 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
10f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
10fa0 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f  * Find a page to
10fb0 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74   recycle.  Try t
10fc0 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  o locate a page 
10fd0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  that does not.  
10fe0 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75      ** require u
10ff0 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
11000 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
11010 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
11020 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
11030 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20  pFirstSynced;.. 
11040 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f       /* If we co
11050 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70  uld not find a p
11060 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
11070 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79  t require an fsy
11080 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  nc().      ** on
11090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
110a0 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65  e then fsync the
110b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
110c0 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20 20  This is a.      
110d0 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
110e0 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
110f0 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
11100 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
11110 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  mes.      ** it 
11120 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e  can't be helped.
11130 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11140 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
11150 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
11160 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
11170 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
11180 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
11190 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
111a0 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
111b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
111c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
111d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
111e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
111f0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
11200 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75       /* If in fu
11210 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72  ll-sync mode, wr
11220 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61  ite a new journa
11230 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68  l header into th
11240 65 0a 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e..  ** journal 
11250 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
11260 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
11270 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
11280 72 6e 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65  rnal..  ** heade
11290 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76  r that is involv
112a0 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
112b0 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  ck of pages that
112c0 20 68 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65   have..  ** alre
112d0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
112e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
112f0 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
11300 61 64 65 72 20 69 73 0a 09 20 20 2a 2a 20 74 72  ader is..  ** tr
11310 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ashed when the n
11320 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
11330 61 74 65 64 29 2e 0a 20 20 20 20 20 20 20 20 20  ated)..         
11340 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50   */.          pP
11350 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
11360 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
11370 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
11380 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20  lOff > 0 );.    
11390 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
113a0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
113b0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
113c0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
113d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
113e0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
113f0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
11400 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11410 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20  IOERR;.         
11420 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
11430 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
11440 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  r->pFirst;.     
11450 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
11460 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b   pPg->nRef==0 );
11470 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
11480 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
11490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
114a0 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20  f it is dirty.. 
114b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
114c0 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
114d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
114e0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
114f0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   );.        pPg-
11500 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
11510 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
11520 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20  write_pagelist( 
11530 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69  pPg );.        i
11540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11560 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
11570 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11580 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
11590 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
115a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
115b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
115c0 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  >dirty==0 );..  
115d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
115e0 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
115f0 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
11600 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
11610 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73   then.      ** s
11620 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
11630 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
11640 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
11650 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  g the.      ** s
11660 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  qlite_dont_rollb
11670 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
11680 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
11690 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
116a0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74  ion..      ** It
116b0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
116c0 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
116d0 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
116e0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
116f0 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62        ** might b
11700 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
11710 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
11720 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
11730 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
11740 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
11750 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  was marked alway
11760 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73  sRollback.  This
11770 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20   means that all 
11780 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20  pages must.     
11790 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
117a0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
117b0 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
117c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
117d0 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
117e0 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
117f0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61      pPager->alwa
11800 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
11810 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
11820 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64  * Unlink the old
11830 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
11840 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ree list and the
11850 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20   hash table.    
11860 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e    */.      unlin
11870 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
11880 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b    pPager->nOvfl+
11890 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  +;.    }.    pPg
118a0 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
118b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
118c0 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  InJournal && (in
118d0 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
118e0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
118f0 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
11900 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61  Memory(pPager->a
11910 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f  InJournal, pgno/
11920 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  8);.      assert
11930 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
11940 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70  lOpen );.      p
11950 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
11960 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
11970 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
11980 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
11990 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
119a0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Sync = 0;.    }e
119b0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
119c0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
119d0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
119e0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
119f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
11a00 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67  nStmt && (int)pg
11a10 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
11a20 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
11a30 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49    && (pPager->aI
11a40 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20  nStmt[pgno/8] & 
11a50 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
11a60 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  0 ){.      page_
11a70 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
11a80 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
11a90 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d  {.      page_rem
11aa0 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69  ove_from_stmt_li
11ab0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
11ac0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
11ad0 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  0;.    pPg->nRef
11ae0 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46   = 1;.    REFINF
11af0 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67  O(pPg);.    pPag
11b00 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
11b10 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
11b20 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  gno);.    pPg->p
11b30 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
11b40 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
11b50 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
11b60 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
11b70 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
11b80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11b90 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
11ba0 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
11bb0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
11bc0 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
11bd0 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
11be0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45    if( pPager->nE
11bf0 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20  xtra>0 ){.      
11c00 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
11c10 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
11c20 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
11c30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
11c40 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29  ager->dbSize<0 )
11c50 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
11c60 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
11c70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
11c80 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
11c90 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
11ca0 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
11cb0 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
11cc0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
11cd0 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
11ce0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11cf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
11d00 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
11d10 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  t)pgno ){.      
11d20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
11d30 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53 51  DATA(pPg), 0, SQ
11d40 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
11d50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11d60 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
11d70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11d80 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
11d90 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
11da0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
11db0 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
11dc0 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
11dd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11de0 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
11df0 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
11e00 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45  ATA(pPg), SQLITE
11e10 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
11e20 20 20 20 54 52 41 43 45 32 28 22 46 45 54 43 48     TRACE2("FETCH
11e30 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
11e40 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
11e50 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
11e60 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
11e70 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
11e80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11e90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11ea0 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a     off_t fileSiz
11eb0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
11ec0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
11ed0 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69  (&pPager->fd,&fi
11ee0 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f  leSize)!=SQLITE_
11ef0 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK.             
11f00 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70    || fileSize>=p
11f10 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  gno*SQLITE_PAGE_
11f20 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
11f30 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
11f40 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
11f50 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
11f60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11f70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11f80 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
11f90 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
11fa0 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  ), 0, SQLITE_PAG
11fb0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
11fc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11fd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
11fe0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
11ff0 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
12000 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
12010 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b   pPager->nHit++;
12020 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
12030 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
12040 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  e = PGHDR_TO_DAT
12050 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  A(pPg);.  return
12060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12070 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
12080 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
12090 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
120a0 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
120b0 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
120c0 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
120d0 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
120e0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
120f0 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
12100 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
12110 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
12120 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
12130 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  _get().  The dif
12140 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
12150 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
12160 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  and sqlite3pager
12170 5f 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  _get() is that _
12180 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
12190 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
121a0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
121b0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
121c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
121d0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
121e0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
121f0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
12200 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
12210 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
12220 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
12230 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
12240 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70  /.void *sqlite3p
12250 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
12260 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
12270 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
12280 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
12290 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
122a0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
122b0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
122c0 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
122d0 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
122e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
122f0 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
12300 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
12310 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
12320 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12330 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
12340 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
12350 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
12360 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
12370 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
12380 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
12390 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
123a0 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
123b0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
123c0 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
123d0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
123e0 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
123f0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
12400 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
12410 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
12420 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
12430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
12440 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
12450 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
12460 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  _unref(void *pDa
12470 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
12480 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  g;..  /* Decreme
12490 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
124a0 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
124b0 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20  page.  */.  pPg 
124c0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
124d0 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
124e0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
124f0 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
12500 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
12510 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
12520 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
12530 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
12540 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
12550 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
12560 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
12570 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
12580 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
12590 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
125a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
125b0 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
125c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
125d0 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30  g->pNextFree = 0
125e0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
125f0 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Free = pPager->p
12600 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Last;.    pPager
12610 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20  ->pLast = pPg;. 
12620 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
12630 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
12640 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
12650 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a  NextFree = pPg;.
12660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12670 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
12680 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
12690 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
126a0 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
126b0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
126c0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
126d0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
126e0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
126f0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
12700 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
12710 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
12720 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67  ctor(pData, pPag
12730 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
12740 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
12750 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
12760 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
12770 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
12780 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
12790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
127a0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
127b0 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
127c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
127d0 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
127e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
127f0 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72  ef==0 && !pPager
12800 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
12810 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
12820 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
12830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12840 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
12850 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
12860 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
12870 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
12880 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
12890 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
128a0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
128b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
128c0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
128d0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
128e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
128f0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
12900 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
12910 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
12920 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
12930 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
12940 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
12950 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12960 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
12970 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
12980 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
12990 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
129a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
129b0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
129c0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
129d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
129e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
129f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12a00 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
12a10 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
12a20 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
12a30 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
12a40 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
12a50 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
12a60 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
12a70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
12a80 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
12a90 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
12aa0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
12ab0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
12ac0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
12ad0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
12ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12af0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
12b00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
12b10 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
12b20 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
12b30 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65  Pager->jfd,pPage
12b40 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
12b50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12b60 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
12b70 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
12b80 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12b90 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28  alHdr = 0;.  if(
12ba0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12bb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
12bc0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
12bd0 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
12be0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
12bf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55  ;.    sqlite3OsU
12c00 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
12c10 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
12c20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
12c30 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
12c40 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
12c50 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
12c60 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70   }.  sqlite3OsOp
12c70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67  enDirectory(pPag
12c80 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
12c90 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
12ca0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12cb0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
12cc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
12cd0 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
12ce0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
12cf0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
12d00 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
12d10 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
12d20 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12d30 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
12d40 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
12d50 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
12d60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12d70 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
12d80 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
12d90 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20  dbSize;..  rc = 
12da0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
12db0 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
12dc0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
12dd0 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
12de0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
12df0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
12e00 74 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72  tmt_begin(pPager
12e10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
12e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12e30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
12e40 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
12e50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12e70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
12e80 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
12e90 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f  eturn rc;  .}../
12ea0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
12eb0 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
12ec0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
12ed0 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
12ee0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
12ef0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
12f00 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
12f10 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
12f20 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c  _commit() is cal
12f30 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
12f40 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
12f50 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
12f60 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
12f70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20  ager_close() is 
12f80 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
12f90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
12fa0 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
12fb0 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
12fc0 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
12fd0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
12fe0 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
12ff0 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
13000 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
13010 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
13020 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
13030 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
13040 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
13050 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
13060 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
13070 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
13080 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
13090 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
130a0 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
130b0 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
130c0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
130d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
130e0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
130f0 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
13100 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
13110 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
13120 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
13130 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
13140 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
13150 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
13160 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
13170 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
13180 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
13190 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
131a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
131b0 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
131c0 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
131d0 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
131e0 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
131f0 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
13200 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
13210 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
13220 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
13230 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
13240 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
13250 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
13260 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
13270 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
13280 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
13290 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61  _begin(void *pDa
132a0 74 61 2c 20 69 6e 74 20 64 75 6d 6d 79 5f 66 69  ta, int dummy_fi
132b0 78 6d 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  xme){.  PgHdr *p
132c0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
132d0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
132e0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
132f0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
13300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13310 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13320 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
13330 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
13340 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
13350 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
13360 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
13370 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
13380 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
13390 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
133a0 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
133b0 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  b ){.      pPage
133c0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
133d0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
133e0 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
133f0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
13400 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
13410 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 75 73 79  {.      int busy
13420 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 6f 20 7b   = 1;.      do {
13430 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13440 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
13450 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
13460 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
13470 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
13480 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20 20 20  E_BUSY && .     
13490 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
134a0 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a 20 20  syHandler && .  
134b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
134c0 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46  pBusyHandler->xF
134d0 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20 20  unc && .        
134e0 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
134f0 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50  andler->xFunc(pP
13500 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
13510 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b  er->pArg, busy++
13520 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
13530 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13540 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
13550 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
13560 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
13570 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
13580 45 52 56 45 44 3b 0a 20 20 20 20 20 20 70 50 61  ERVED;.      pPa
13590 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
135a0 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
135b0 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  2("TRANSACTION %
135c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
135d0 2e 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  .h);.      if( p
135e0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
135f0 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
13600 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
13610 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
13620 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
13630 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13640 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
13660 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
13670 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
13680 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
13690 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
136a0 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
136b0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
136c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
136d0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
136e0 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
136f0 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
13700 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
13710 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
13720 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
13730 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
13740 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
13750 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
13760 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
13770 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
13780 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
13790 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
137a0 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
137b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
137c0 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
137d0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
137e0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
137f0 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
13800 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
13810 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
13820 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
13830 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
13840 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
13850 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
13860 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
13870 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
13880 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
13890 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
138a0 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
138b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
138c0 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
138d0 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
138e0 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
138f0 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
13900 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
13910 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
13920 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
13930 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
13940 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  l to sqlite3page
13950 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  r_commit() or sq
13960 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
13970 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
13980 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
13990 33 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69  3pager_write(voi
139a0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
139b0 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
139c0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
139d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
139e0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
139f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13a00 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
13a10 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
13a20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
13a30 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72  rrMask ){ .    r
13a40 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
13a50 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
13a60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
13a70 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
13a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
13a90 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  M;.  }..  assert
13aa0 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
13ab0 73 74 65 72 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ster );..  /* Ma
13ac0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
13ad0 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
13ae0 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
13af0 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
13b00 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
13b10 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
13b20 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
13b30 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79   */.  pPg->dirty
13b40 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
13b50 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
13b60 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50  Pg->inStmt || pP
13b70 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
13b80 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
13b90 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
13ba0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
13bb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
13bc0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
13bd0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
13be0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
13bf0 65 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77  eds to be.  ** w
13c00 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
13c10 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
13c20 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
13c30 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  int journal.  **
13c40 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20   or both..  **. 
13c50 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
13c60 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
13c70 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
13c80 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
13c90 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
13ca0 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
13cb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
13cc0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
13cd0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63  R_UNLOCK );.  rc
13ce0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
13cf0 62 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b  begin(pData, 0);
13d00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13d10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
13d20 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
13d30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
13d40 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
13d50 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ED );.  if( !pPa
13d60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
13d70 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
13d80 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63  ournal ){.    rc
13d90 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
13da0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
13db0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13dc0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
13dd0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
13de0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13df0 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
13e00 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
13e10 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
13e20 68 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68  he = 1;..  /* Th
13e30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
13e40 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
13e50 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
13e60 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
13e70 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
13e80 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
13e90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
13ea0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
13eb0 70 61 67 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65  page to.  ** the
13ec0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
13ed0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
13ee0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
13ef0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67  .  */.  if( !pPg
13f00 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
13f10 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
13f20 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65  al || pPager->me
13f30 6d 44 62 29 20 29 7b 0a 20 20 20 20 69 66 28 20  mDb) ){.    if( 
13f40 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
13f50 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
13f60 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  Size ){.      in
13f70 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 75 33  t szPg;.      u3
13f80 32 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 69  2 saved;.      i
13f90 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
13fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
13fb0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
13fc0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
13fd0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
13fe0 20 20 20 54 52 41 43 45 32 28 22 4a 4f 55 52 4e     TRACE2("JOURN
13ff0 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  AL page %d\n", p
14000 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
14010 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
14020 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20  ->pOrig==0 );.  
14030 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72        pHist->pOr
14040 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ig = sqliteMallo
14050 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
14060 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
14070 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
14080 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ig ){.          
14090 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
140a0 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
140b0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
140c0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
140d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
140e0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
140f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14100 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
14110 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
14120 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
14130 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
14140 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a    saved = *(u32*
14150 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  )PGHDR_TO_EXTRA(
14160 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 74  pPg);.        st
14170 6f 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c  ore32bits(cksum,
14180 20 70 50 67 2c 20 53 51 4c 49 54 45 5f 50 41 47   pPg, SQLITE_PAG
14190 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
141a0 20 73 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f 50   szPg = SQLITE_P
141b0 41 47 45 5f 53 49 5a 45 2b 38 3b 0a 20 20 20 20  AGE_SIZE+8;.    
141c0 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28      store32bits(
141d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20  pPg->pgno, pPg, 
141e0 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  -4);.        COD
141f0 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
14200 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
14210 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14220 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
14230 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68  ager->jfd, &((ch
14240 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20  ar*)pData)[-4], 
14250 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70  szPg);.        p
14260 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14270 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20  f += szPg;.     
14280 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e     TRACE3("JOURN
14290 41 4c 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  AL page %d needS
142a0 79 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  ync=%d\n", pPg->
142b0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
142c0 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  ync);.        CO
142d0 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
142e0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29  a, pPg->pgno, 0)
142f0 3b 0a 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a  ;.        *(u32*
14300 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  )PGHDR_TO_EXTRA(
14310 70 50 67 29 20 3d 20 73 61 76 65 64 3b 0a 20 20  pPg) = saved;.  
14320 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14340 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
14350 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
14360 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  r);.          pP
14370 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
14380 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b   PAGER_ERR_FULL;
14390 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
143a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
143b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
143c0 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
143d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
143e0 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
143f0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
14400 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
14410 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
14420 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
14430 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
14440 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
14450 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 70  oSync;.        p
14460 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
14470 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  1;.        if( p
14480 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
14490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
144a0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
144b0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
144c0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
144d0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61            page_a
144e0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
144f0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pPg);.        }.
14500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14510 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  e{.      pPg->ne
14520 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
14530 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
14540 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
14550 79 6e 63 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ync;.      TRACE
14560 33 28 22 41 50 50 45 4e 44 20 70 61 67 65 20 25  3("APPEND page %
14570 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
14580 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
14590 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
145a0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
145b0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
145c0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
145d0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  nc = 1;.    }.  
145e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  }..  /* If the s
145f0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
14600 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
14610 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
14620 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72  it,.  ** then wr
14630 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
14640 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
14650 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
14660 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74  Note that.  ** t
14670 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
14680 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
14690 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
146a0 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
146b0 72 6d 61 74 0a 20 20 2a 2a 20 69 6e 20 74 68 61  rmat.  ** in tha
146c0 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
146d0 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
146e0 20 68 65 61 64 65 72 2e 0a 20 20 2a 2f 0a 20 20   header..  */.  
146f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
14700 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
14710 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
14720 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
14730 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
14740 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
14750 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
14760 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
14770 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
14780 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14790 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50  memDb ){.      P
147a0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
147b0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
147c0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
147d0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
147e0 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t->pStmt==0 );. 
147f0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
14800 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
14810 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
14820 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
14830 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
14840 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
14850 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  y(pHist->pStmt, 
14860 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
14870 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
14880 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
14890 20 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d       TRACE2("STM
148a0 54 2d 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25  T-JOURNAL page %
148b0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  d\n", pPg->pgno)
148c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
148d0 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
148e0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
148f0 34 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28  4);.      CODEC(
14900 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
14910 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
14920 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14930 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
14940 3e 73 74 66 64 2c 20 28 28 63 68 61 72 2a 29 70  >stfd, ((char*)p
14950 44 61 74 61 29 2d 34 2c 20 53 51 4c 49 54 45 5f  Data)-4, SQLITE_
14960 50 41 47 45 5f 53 49 5a 45 2b 34 29 3b 0a 20 20  PAGE_SIZE+4);.  
14970 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
14980 2d 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25 64  -JOURNAL page %d
14990 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  \n", pPg->pgno);
149a0 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
149b0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
149c0 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20  >pgno, 0);.     
149d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
149e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
149f0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
14a00 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
14a10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
14a20 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
14a30 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  R_FULL;.        
14a40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14a50 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
14a60 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
14a70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14a80 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
14a90 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
14aa0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
14ab0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
14ac0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20  pgno&7);.    }. 
14ad0 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
14ae0 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
14af0 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
14b00 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
14b10 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
14b20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
14b30 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
14b40 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
14b50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
14b60 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
14b70 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
14b80 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
14b90 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
14ba0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
14bb0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
14bc0 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20  r->dbSize++;.   
14bd0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14be0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
14bf0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
14c00 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
14c10 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
14c20 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
14c30 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61  .** to sqlite3pa
14c40 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e  ger_write().  In
14c50 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
14c60 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
14c70 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
14c80 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
14c90 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69  f the page..*/.i
14ca0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
14cb0 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64  iswriteable(void
14cc0 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
14cd0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
14ce0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
14cf0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72   return pPg->dir
14d00 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  ty;.}../*.** Rep
14d10 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
14d20 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
14d30 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72  e with the infor
14d40 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68  mation in the th
14d50 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ird.** argument.
14d60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
14d70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50  ager_overwrite(P
14d80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
14d90 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70  no pgno, void *p
14da0 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Data){.  void *p
14db0 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
14dc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
14dd0 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
14de0 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a   pgno, &pPage);.
14df0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
14e10 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
14e20 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  te(pPage);.    i
14e30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14e40 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
14e50 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 53  (pPage, pData, S
14e60 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
14e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14e80 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
14e90 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
14ea0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14eb0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
14ec0 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
14ed0 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
14ee0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
14ef0 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
14f00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
14f10 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b  page "pgno" back
14f20 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
14f30 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
14f40 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
14f50 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
14f60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
14f70 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
14f80 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
14f90 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
14fa0 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
14fb0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
14fc0 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65   is unused.  The
14fd0 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
14fe0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
14ff0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
15000 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
15010 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
15020 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
15030 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
15040 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  on, together wit
15050 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  h the.** sqlite3
15060 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
15070 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72  ack() below, mor
15080 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68  e than double th
15090 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61  e speed.** of la
150a0 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61  rge INSERT opera
150b0 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75  tions and quadru
150c0 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
150d0 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a   large DELETEs..
150e0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
150f0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
15100 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79  d, set the alway
15110 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74  sRollback flag t
15120 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65  o true..** Subse
15130 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
15140 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
15150 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
15160 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a  the same page.**
15170 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72   will thereafter
15180 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68   be ignored.  Th
15190 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
151a0 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c  to avoid a probl
151b0 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61  em.** where a pa
151c0 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20  ge with data is 
151d0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
151e0 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65  elist during one
151f0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72   part of.** a tr
15200 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72  ansaction then r
15210 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
15220 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
15230 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20  a later part.** 
15240 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e  of the same tran
15250 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  saction and reus
15260 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ed for some othe
15270 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e  r purpose.  When
15280 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20   it.** is first 
15290 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
152a0 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  elist, this rout
152b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
152c0 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20  When reused,.** 
152d0 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  the dont_rollbac
152e0 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
152f0 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
15300 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e  use the page con
15310 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61  tains.** critica
15320 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
15330 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
15340 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20   it gets rolled 
15350 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a  back in spite.**
15360 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c   of the dont_rol
15370 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
15380 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
15390 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61  er_dont_write(Pa
153a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
153b0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
153c0 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
153d0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65  ager->memDb ) re
153e0 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70  turn;..  pPg = p
153f0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
15400 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67  er, pgno);.  pPg
15410 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
15420 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20   = 1;.  if( pPg 
15430 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  && pPg->dirty ){
15440 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
15450 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50  >dbSize==(int)pP
15460 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65  g->pgno && pPage
15470 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50  r->origDbSize<pP
15480 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
15490 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
154a0 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61   pages is the la
154b0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  st page in the f
154c0 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
154d0 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20   has grown.     
154e0 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63   ** during the c
154f0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
15500 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20  on, then do NOT 
15510 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
15520 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a   clean..      **
15530 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   When the databa
15540 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77  se file grows, w
15550 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65  e must make sure
15560 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
15570 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74  age.      ** get
15580 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61  s written at lea
15590 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20  st once so that 
155a0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69  the disk file wi
155b0 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63  ll be the correc
155c0 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e  t.      ** size.
155d0 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77   If you do not w
155e0 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61  rite this page a
155f0 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
15600 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
15610 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64   on the disk end
15620 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73  s up being too s
15630 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c  mall, that can l
15640 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a  ead to database.
15650 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74        ** corrupt
15660 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e  ion during the n
15670 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ext transaction.
15680 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
15690 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45  lse{.      TRACE
156a0 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
156b0 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
156c0 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66 64  pgno, pPager->fd
156d0 2e 68 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  .h);.      pPg->
156e0 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d  dirty = 0;.    }
156f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
15700 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
15710 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
15720 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
15730 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
15740 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
15750 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
15760 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
15770 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
15780 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
15790 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
157a0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
157b0 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
157c0 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
157d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
157e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
157f0 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
15800 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  k(void *pData){.
15810 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
15820 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
15830 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
15840 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
15850 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  er;..  if( pPage
15860 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
15870 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61  EXCLUSIVE || pPa
15880 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
15890 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
158a0 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
158b0 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
158c0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
158d0 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  k || pPager->mem
158e0 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  Db ) return;.  i
158f0 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
15900 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
15910 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
15920 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
15930 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15940 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
15950 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
15960 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
15970 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
15980 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
15990 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
159a0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
159b0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
159c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
159d0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
159e0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
159f0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
15a00 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
15a10 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
15a20 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e  .    TRACE3("DON
15a30 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
15a40 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
15a50 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e  ->pgno, pPager->
15a60 66 64 2e 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  fd.h);.  }.  if(
15a70 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
15a80 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
15a90 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
15aa0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
15ab0 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  mtSize ){.    as
15ac0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
15ad0 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
15ae0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
15af0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
15b00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15b10 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
15b20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
15b30 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
15b40 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
15b50 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
15b60 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
15b70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  Pg);.  }.}.../*.
15b80 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
15b90 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
15ba0 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
15bb0 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
15bc0 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
15bd0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  teFree(pHist->pO
15be0 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  rig);.  sqliteFr
15bf0 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
15c00 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
15c10 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
15c20 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
15c30 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
15c40 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
15c50 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
15c60 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
15c70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
15c80 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
15c90 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
15ca0 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
15cb0 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
15cc0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
15cd0 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
15ce0 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
15cf0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
15d00 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
15d10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
15d20 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
15d30 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
15d40 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
15d50 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
15d60 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask==PAGER_ERR_F
15d70 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
15d80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
15d90 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
15da0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15db0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
15dc0 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
15dd0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
15de0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
15df0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
15e00 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 ){.    rc = pa
15e10 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
15e20 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
15e30 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
15e40 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
15e50 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
15e60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15e70 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41  ERROR;.  }.  TRA
15e80 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
15e90 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29  ", pPager->fd.h)
15ea0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
15eb0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 67  memDb ){.    pPg
15ec0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
15ed0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
15ee0 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ger);.    while(
15ef0 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c   pPg ){.      cl
15f00 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52  earHistory(PGHDR
15f10 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
15f20 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50  ager));.      pP
15f30 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
15f40 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
15f50 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
15f60 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
15f70 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
15f80 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
15f90 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
15fa0 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
15fb0 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  y;.    }.#ifndef
15fc0 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28   NDEBUG.    for(
15fd0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
15fe0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
15ff0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
16000 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
16010 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
16020 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
16030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
16040 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
16050 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
16060 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
16070 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
16080 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
16090 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
160a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
160b0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
160c0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
160d0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
160e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
160f0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
16100 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
16110 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65  ){.    /* Exit e
16120 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f  arly (without do
16130 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e  ing the time-con
16140 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  suming sqlite3Os
16150 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20  Sync() calls).  
16160 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61    ** if there ha
16170 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
16180 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
16190 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
161a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
161b0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
161c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
161d0 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
161e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
161f0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
16200 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
16210 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16220 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
16230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
16240 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c  ger_sync(pPager,
16250 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
16260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16270 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
16280 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61  t;.  }.  rc = pa
16290 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
162a0 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
162b0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
162c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20    return rc;..  
162d0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
162e0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
162f0 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20 63  ong during the c
16300 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20  ommit process.. 
16310 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74   */.commit_abort
16320 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  :.  rc = sqlite3
16330 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
16340 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
16350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16360 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
16370 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ULL;.  }.  retur
16380 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
16390 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
163a0 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61  ges.  The databa
163b0 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f  se falls back to
163c0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f   PAGER_SHARED mo
163d0 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
163e0 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
163f0 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
16400 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
16410 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
16420 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
16430 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
16440 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
16450 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
16460 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
16470 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
16480 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
16490 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53  king protocol (S
164a0 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20  QLITE_PROTOCOL) 
164b0 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
164c0 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
164d0 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
164e0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
164f0 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
16500 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
16510 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
16520 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
16530 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
16540 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
16550 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
16560 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
16570 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
16580 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
16590 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
165a0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
165b0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
165c0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
165d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52  {.  int rc;.  TR
165e0 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE2("ROLLBACK %
165f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
16600 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  .h);.  if( pPage
16610 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
16620 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
16630 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
16640 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
16650 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
16660 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
16670 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61     assert( !p->a
16680 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
16690 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64  .      if( !p->d
166a0 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
166b0 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
166c0 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
166d0 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
166e0 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
166f0 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
16700 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
16710 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
16720 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  r))->pStmt );.  
16730 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
16740 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
16750 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
16760 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b  HIST(p, pPager);
16770 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
16780 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
16790 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
167a0 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73  TO_DATA(p), pHis
167b0 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72  t->pOrig, pPager
167c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
167d0 20 20 20 20 20 54 52 41 43 45 32 28 22 52 4f 4c       TRACE2("ROL
167e0 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 5c 6e 22  LBACK-PAGE %d\n"
167f0 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  , p->pgno);.    
16800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16810 20 54 52 41 43 45 32 28 22 50 41 47 45 20 25 64   TRACE2("PAGE %d
16820 20 69 73 20 63 6c 65 61 6e 5c 6e 22 2c 20 70 2d   is clean\n", p-
16830 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
16840 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
16850 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
16860 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
16870 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61       p->inJourna
16880 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  l = 0;.      p->
16890 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
168a0 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d    p->pPrevStmt =
168b0 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20   p->pNextStmt = 
168c0 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50  0;..      if( pP
168d0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
168e0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
168f0 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48  r->xReiniter(PGH
16900 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
16910 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16930 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
16940 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
16950 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
16960 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44   = pPager->origD
16970 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  bSize;.    memor
16980 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
16990 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
169a0 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
169b0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
169c0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
169d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
169e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
169f0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
16a00 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d  ache || !pPager-
16a10 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
16a20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
16a30 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
16a40 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
16a50 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20  dbSize = -1;.   
16a60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16a70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
16a80 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61  rrMask!=0 && pPa
16a90 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41  ger->errMask!=PA
16aa0 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
16ab0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16ac0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
16ad0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
16ae0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
16af0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
16b00 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
16b10 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
16b20 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
16b30 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
16b40 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
16b50 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
16b60 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
16b70 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
16b80 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77   rc2 = pager_unw
16b90 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
16ba0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
16bb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16bc0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
16bd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
16be0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
16bf0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
16c00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16c10 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
16c20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
16c30 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
16c40 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
16c50 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70  CORRUPT;.  }.  p
16c60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
16c70 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
16c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16c90 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
16ca0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
16cb0 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
16cc0 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
16cd0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
16ce0 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
16cf0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
16d00 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
16d10 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
16d20 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
16d30 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
16d40 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ly;.}../*.** Thi
16d50 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
16d60 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
16d70 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
16d80 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
16d90 70 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65  pager_stats(Page
16da0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
16db0 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20  atic int a[9];. 
16dc0 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
16dd0 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
16de0 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
16df0 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
16e00 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
16e10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
16e20 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
16e30 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
16e40 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
16e50 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
16e60 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
16e70 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
16e80 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72  .  a[8] = pPager
16e90 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72  ->nOvfl;.  retur
16ea0 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n a;.}../*.** Se
16eb0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
16ec0 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
16ed0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16ee0 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
16ef0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
16f00 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
16f10 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
16f20 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
16f30 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
16f40 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
16f50 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
16f60 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
16f70 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
16f80 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
16f90 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
16fa0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
16fb0 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69  3pager_stmt_begi
16fc0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
16fd0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
16fe0 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
16ff0 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
17000 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
17010 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
17020 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42    TRACE2("STMT-B
17030 45 47 49 4e 20 25 64 5c 6e 22 2c 20 70 50 61 67  EGIN %d\n", pPag
17040 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28  er->fd.h);.  if(
17050 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
17060 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
17070 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20  mtInUse = 1;.   
17080 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
17090 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
170a0 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ze;.    return S
170b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
170c0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
170d0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
170e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
170f0 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65  open = 1;.    re
17100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17110 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
17120 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17130 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  n );.  pPager->a
17140 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  InStmt = sqliteM
17150 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
17160 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
17170 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
17180 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Stmt==0 ){.    s
17190 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
171a0 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
171b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75  _LOCK);.    retu
171c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
171d0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
171e0 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BUG.  rc = sqlit
171f0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
17200 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
17210 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
17220 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
17230 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
17240 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  d;.  assert( pPa
17250 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
17260 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
17270 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  lOff );.#endif. 
17280 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
17290 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ze = pPager->jou
172a0 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
172b0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
172c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
172d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
172e0 66 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  ff = 0;.  if( !p
172f0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
17300 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
17310 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
17320 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72  p(zTemp, &pPager
17330 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28  ->stfd);.    if(
17340 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
17350 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
17360 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
17370 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
17380 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
17390 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
173a0 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
173b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
173c0 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
173d0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
173e0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b  ager->aInStmt ){
173f0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
17400 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29  pPager->aInStmt)
17410 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
17420 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
17430 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17440 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74  *.** Commit a st
17450 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
17460 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
17470 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  t_commit(Pager *
17480 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
17490 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
174a0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
174b0 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  Pg, *pNext;.    
174c0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
174d0 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  MIT %d\n", pPage
174e0 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69 66  r->fd.h);.    if
174f0 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
17500 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17510 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
17520 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  >stfd, 0);.     
17530 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75   /* sqlite3OsTru
17540 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73  ncate(&pPager->s
17550 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  tfd, 0); */.    
17560 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
17570 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b  ager->aInStmt );
17580 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
17590 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  InStmt = 0;.    
175a0 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  }.    for(pPg=pP
175b0 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
175c0 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
175d0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
175e0 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20  >pNextStmt;.    
175f0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
17600 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
17610 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
17620 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
17630 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
17640 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
17650 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
17660 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  Db ){.        Pg
17670 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
17680 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
17690 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
176a0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
176b0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
176c0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
176d0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
176e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
176f0 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
17700 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
17710 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
17720 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
17730 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
17740 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
17750 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
17760 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17770 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
17780 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
17790 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72  ite3pager_stmt_r
177a0 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
177b0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
177c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
177d0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
177e0 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f   TRACE2("STMT-RO
177f0 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50  LLBACK %d\n", pP
17800 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20  ager->fd.h);.   
17810 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
17820 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  Db ){.      PgHd
17830 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f  r *pPg;.      fo
17840 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
17850 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  tmt; pPg; pPg=pP
17860 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20  g->pNextStmt){. 
17870 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
17880 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
17890 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
178a0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
178b0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
178c0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
178d0 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
178e0 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53  (pPg), pHist->pS
178f0 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  tmt, pPager->pag
17900 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
17910 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
17920 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
17930 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
17940 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
17950 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
17960 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
17970 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
17980 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54  e;.      memoryT
17990 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
179a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
179b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
179c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
179d0 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
179e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
179f0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
17a00 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61  _stmt_commit(pPa
17a10 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
17a20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
17a30 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
17a40 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
17a50 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
17a60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17a70 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
17a80 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
17a90 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
17aa0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61   char *sqlite3pa
17ab0 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67  ger_filename(Pag
17ac0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
17ad0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46  eturn pPager->zF
17ae0 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
17af0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72  * Return the dir
17b00 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61  ectory of the da
17b10 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
17b20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
17b30 74 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65  te3pager_dirname
17b40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17b50 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
17b60 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a  ->zDirectory;.}.
17b70 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17b80 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
17b90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
17ba0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
17bb0 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  ar *sqlite3pager
17bc0 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67  _journalname(Pag
17bd0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
17be0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a  eturn pPager->zJ
17bf0 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ournal;.}../*.**
17c00 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
17c10 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
17c20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
17c30 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20  er_set_codec(.  
17c40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
17c50 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
17c60 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
17c70 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
17c80 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
17c90 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
17ca0 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
17cb0 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
17cc0 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  decArg;.}../*.**
17cd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
17ce0 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
17cf0 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  ment the databas
17d00 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
17d10 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64  unter,.** stored
17d20 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74   at byte 24 of t
17d30 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
17d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
17d50 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
17d60 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
17d70 67 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ger){.  void *pP
17d80 61 67 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  age;.  PgHdr *pP
17d90 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e  gHdr;.  u32 chan
17da0 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e  ge_counter;.  in
17db0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  t rc;..  /* Open
17dc0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
17dd0 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
17de0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
17df0 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
17e00 65 72 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a  er, 1, &pPage);.
17e10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17e20 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
17e30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
17e40 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
17e50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17e60 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
17e70 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  rc;..  /* Read t
17e80 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
17e90 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   at byte 24. */.
17ea0 20 20 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f    pPgHdr = DATA_
17eb0 54 4f 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b  TO_PGHDR(pPage);
17ec0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
17ed0 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69  r = retrieve32bi
17ee0 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a  ts(pPgHdr, 24);.
17ef0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
17f00 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
17f10 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
17f20 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
17f30 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f  . */.  change_co
17f40 75 6e 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65  unter++;.  store
17f50 33 32 62 69 74 73 28 63 68 61 6e 67 65 5f 63 6f  32bits(change_co
17f60 75 6e 74 65 72 2c 20 70 50 67 48 64 72 2c 20 32  unter, pPgHdr, 2
17f70 34 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  4);..  /* Releas
17f80 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
17f90 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ence. */.  sqlit
17fa0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
17fb0 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  age);.  return S
17fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17fd0 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
17fe0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
17ff0 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
18000 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
18010 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
18020 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18030 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
18040 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
18050 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
18060 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
18070 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
18080 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
18090 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
180a0 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
180b0 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
180c0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
180d0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
180e0 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
180f0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
18100 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c  l is synced, all
18110 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69   dirty pages wri
18120 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tten.** to the d
18130 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
18140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18150 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f  le synced. The o
18160 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a  nly thing that.*
18170 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  * remains to com
18180 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
18190 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ion is to delete
181a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
181b0 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20  e (or.** master 
181c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
181d0 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
181e0 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
181f0 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
18200 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
18210 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
18220 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
18230 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61   to an sqlite3pa
18240 67 65 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ger_sync() call.
18250 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
18260 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20  ager_sync(Pager 
18270 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
18280 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
18290 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
182a0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  _OK;..  /* If th
182b0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
182c0 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
182d0 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
182e0 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
182f0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
18300 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
18310 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
18320 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
18330 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
18340 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
18350 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
18360 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  && pPager->dirty
18370 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48  Cache ){.    PgH
18380 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73  dr *pPg;.    ass
18390 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
183a0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20  rnalOpen );..   
183b0 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   /* If a master 
183c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
183d0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
183e0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
183f0 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
18400 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73   file, then no s
18410 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
18420 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
18430 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20  en it is.    ** 
18440 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68  written, then th
18450 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20  e process fails 
18460 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
18470 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e  a RESERVED to an
18480 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
18490 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74  E lock. The next
184a0 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73   time the proces
184b0 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69  s tries to commi
184c0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
184d0 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a  nsaction the m-j
184e0 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20   name will have 
184f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
18500 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
18510 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65   if( !pPager->se
18520 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  tMaster ){.     
18530 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
18540 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
18550 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
18560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18570 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
18580 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
18590 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
185a0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
185b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
185c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
185d0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
185e0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
185f0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
18600 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18610 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
18620 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  exit;.    }..   
18630 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
18640 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
18650 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
18660 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
18670 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
18680 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
18690 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
186a0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
186b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
186c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
186d0 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20  sync_exit;..    
186e0 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
186f0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
18700 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
18710 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
18720 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
18730 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  c(&pPager->fd);.
18740 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
18750 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
18760 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79  _SYNCED;.  }..sy
18770 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  nc_exit:.  retur
18780 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  n rc;.}..#if def
18790 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
187a0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
187b0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
187c0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
187d0 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
187e0 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
187f0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
18800 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
18810 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
18820 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
18830 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
18840 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
18850 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
18860 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
18870 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
18880 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
18890 65 72 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54  er){.#ifdef OS_T
188a0 45 53 54 0a 20 20 72 65 74 75 72 6e 20 70 50 61  EST.  return pPa
188b0 67 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b  ger->fd->fd.lock
188c0 74 79 70 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65  type;.#else.  re
188d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e  turn pPager->fd.
188e0 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66  locktype;.#endif
188f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
18900 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
18910 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
18920 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
18930 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
18940 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
18950 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18960 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61  pager_refdump(Pa
18970 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
18980 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
18990 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
189a0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
189b0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
189c0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
189d0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
189e0 20 20 70 72 69 6e 74 66 28 22 50 41 47 45 20 25    printf("PAGE %
189f0 33 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e  3d addr=0x%08x n
18a00 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
18a10 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69     pPg->pgno, (i
18a20 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  nt)PGHDR_TO_DATA
18a30 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
18a40 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.