/ Hex Artifact Content
Login

Artifact d9d3f577319ebac6670d3f44eca46060b78ee6b2:


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 33  : pager.c,v 1.13
0350: 34 20 32 30 30 34 2f 30 36 2f 32 32 20 31 31 3a  4 2004/06/22 11:
0360: 32 39 3a 30 32 20 64 61 6e 69 65 6c 6b 31 39 37  29:02 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 69 6e 74 20 6e  abase */.  int n
29a0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
29b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29c0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 73   of bytes to res
29d0: 65 72 76 65 20 66 6f 72 20 6d 61 73 74 65 72 20  erve for master 
29e0: 6a 2e 70 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e  j.p */.  BusyHan
29f0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
2a00: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
2a10: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
2a20: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64 72  ndler */.  PgHdr
2a30: 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74   *pFirst, *pLast
2a40: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
2a50: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
2a60: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
2a70: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  ynced;        /*
2a80: 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65   First free page
2a90: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64   with PgHdr.need
2aa0: 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  Sync==0 */.  PgH
2ab0: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
2ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2ad0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
2ae0: 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b  .  PgHdr *pStmt;
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b00: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
2b10: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
2b20: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
2b30: 20 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f   PgHdr *aHash[N_
2b40: 50 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20  PG_HASH];    /* 
2b50: 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61  Hash table to ma
2b60: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  p page number to
2b70: 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   PgHdr */.};../*
2b80: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69  .** These are bi
2b90: 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ts that can be s
2ba0: 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d  et in Pager.errM
2bb0: 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask..*/.#define 
2bc0: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20  PAGER_ERR_FULL  
2bd0: 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72     0x01  /* a wr
2be0: 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  ite() failed */.
2bf0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
2c00: 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20  R_MEM      0x02 
2c10: 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   /* malloc() fai
2c20: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
2c30: 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20  AGER_ERR_LOCK   
2c40: 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72    0x04  /* error
2c50: 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
2c60: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66  protocol */.#def
2c70: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  ine PAGER_ERR_CO
2c80: 52 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20  RRUPT  0x08  /* 
2c90: 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72  database or jour
2ca0: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  nal corruption *
2cb0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
2cc0: 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31  ERR_DISK     0x1
2cd0: 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69  0  /* general di
2ce0: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62  sk I/O error - b
2cf0: 61 64 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a  ad hard drive? *
2d00: 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  /../*.** Journal
2d10: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
2d20: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
2d30: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
2d40: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
2d50: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
2d60: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
2d70: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
2d80: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
2d90: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
2da0: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
2db0: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
2dc0: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
2dd0: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
2de0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
2df0: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
2e00: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
2e10: 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a  urnal is begin.*
2e20: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
2e30: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
2e40: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
2e50: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
2e60: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
2e70: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
2e80: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
2e90: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
2ea0: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
2eb0: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
2ec0: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
2ed0: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
2ee0: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
2ef0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
2f00: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
2f10: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
2f20: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
2f30: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
2f40: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
2f50: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
2f60: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
2f70: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
2f80: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
2f90: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
2fa0: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
2fb0: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
2fc0: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
2fd0: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
2fe0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
2ff0: 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f 50 41  nd the SQLITE_PA
3000: 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66  GE_SIZE bytes of
3010: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
3020: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
3030: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
3040: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
3050: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
3060: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
3070: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
3080: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
3090: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
30a0: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
30b0: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
30c0: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
30d0: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
30e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
30f0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
3100: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
3110: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
3120: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
3130: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
3140: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
3150: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
3160: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
3170: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
3180: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
3190: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
31a0: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
31b0: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
31c0: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
31d0: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
31e0: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
31f0: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
3200: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
3210: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
3220: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
3230: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
3240: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
3250: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
3260: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
3270: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
3280: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
3290: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66  he header and of
32a0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
32b0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74  e journal is det
32c0: 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68  ermined.** by th
32d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
32e0: 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  os..*/.#define J
32f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
3300: 61 67 65 72 29 20 28 32 34 20 2b 20 28 70 50 61  ager) (24 + (pPa
3310: 67 65 72 29 2d 3e 6e 4d 61 73 74 65 72 29 0a 23  ger)->nMaster).#
3320: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
3330: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
3340: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
3350: 29 20 2b 20 38 29 0a 0a 0a 2f 2a 0a 2a 2a 20 45  ) + 8).../*.** E
3360: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
3370: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
3380: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
3390: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
33a0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
33b0: 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f   pager3_refinfo_
33c0: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
33d0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
33e0: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
33f0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
3400: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
3410: 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e  f( !pager3_refin
3420: 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75  fo_enable ) retu
3430: 72 6e 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 0a  rn;.    printf(.
3440: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
3450: 25 34 64 20 61 64 64 72 3d 30 78 25 30 38 78 20  %4d addr=0x%08x 
3460: 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  nRef=%d\n",.    
3470: 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74     p->pgno, (int
3480: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
3490: 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29  ), p->nRef.    )
34a0: 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f  ;.    cnt++;   /
34b0: 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73  * Something to s
34c0: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
34d0: 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69  on */.  }.# defi
34e0: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70  ne REFINFO(X)  p
34f0: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a  ager_refinfo(X).
3500: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52  #else.# define R
3510: 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66  EFINFO(X).#endif
3520: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
3530: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
3540: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
3550: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
3560: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
3570: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
3580: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
3590: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
35a0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
35b0: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
35c0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
35d0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
35e0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
35f0: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
3600: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
3610: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
3620: 20 72 65 61 64 33 32 62 69 74 73 28 4f 73 46 69   read32bits(OsFi
3630: 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65  le *fd, u32 *pRe
3640: 73 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20  s){.  u32 res;. 
3650: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
3660: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
3670: 2c 20 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72  , &res, sizeof(r
3680: 65 73 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  es));.  if( rc==
3690: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
36b0: 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  c[4];.    memcpy
36c0: 28 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20  (ac, &res, 4);. 
36d0: 20 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c     res = (ac[0]<
36e0: 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31  <24) | (ac[1]<<1
36f0: 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20  6) | (ac[2]<<8) 
3700: 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a  | ac[3];.  }.  *
3710: 70 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65  pRes = res;.  re
3720: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3730: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
3740: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
3750: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
3760: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
3770: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
3780: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
3790: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
37a0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
37b0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
37c0: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
37d0: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
37e0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
37f0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30  ar ac[4];.  ac[0
3800: 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20  ] = (val>>24) & 
3810: 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20  0xff;.  ac[1] = 
3820: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
3830: 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c  ;.  ac[2] = (val
3840: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >>8) & 0xff;.  a
3850: 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66  c[3] = val & 0xf
3860: 66 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  f;.  return sqli
3870: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
3880: 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c, 4);.}../*.** 
3890: 57 72 69 74 65 20 74 68 65 20 33 32 2d 62 69 74  Write the 32-bit
38a0: 20 69 6e 74 65 67 65 72 20 27 76 61 6c 27 20 69   integer 'val' i
38b0: 6e 74 6f 20 74 68 65 20 70 61 67 65 20 69 64 65  nto the page ide
38c0: 6e 74 69 66 69 65 64 20 62 79 20 70 61 67 65 20  ntified by page 
38d0: 68 65 61 64 65 72 0a 2a 2a 20 27 70 27 20 61 74  header.** 'p' at
38e0: 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27   offset 'offset'
38f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3900: 20 73 74 6f 72 65 33 32 62 69 74 73 28 75 33 32   store32bits(u32
3910: 20 76 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20   val, PgHdr *p, 
3920: 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75  int offset){.  u
3930: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63  nsigned char *ac
3940: 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69  ;.  ac = &((unsi
3950: 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52  gned char*)PGHDR
3960: 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66  _TO_DATA(p))[off
3970: 73 65 74 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20  set];.  ac[0] = 
3980: 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66  (val>>24) & 0xff
3990: 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c  ;.  ac[1] = (val
39a0: 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20  >>16) & 0xff;.  
39b0: 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29  ac[2] = (val>>8)
39c0: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d   & 0xff;.  ac[3]
39d0: 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d   = val & 0xff;.}
39e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
39f0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61 74  2-bit integer at
3a00: 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27   offset 'offset'
3a10: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
3a20: 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
3a30: 70 61 67 65 20 68 65 61 64 65 72 20 27 70 27 2e  page header 'p'.
3a40: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72  .*/.static u32 r
3a50: 65 74 72 69 65 76 65 33 32 62 69 74 73 28 50 67  etrieve32bits(Pg
3a60: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
3a70: 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  et){.  unsigned 
3a80: 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d  char *ac;.  ac =
3a90: 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61   &((unsigned cha
3aa0: 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
3ab0: 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  (p))[offset];.  
3ac0: 72 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32  return (ac[0]<<2
3ad0: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
3ae0: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
3af0: 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ac[3];.}.../*.**
3b00: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74   Convert the bit
3b10: 73 20 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d  s in the pPager-
3b20: 3e 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e  >errMask into an
3b30: 20 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72   approprate.** r
3b40: 65 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73  eturn code..*/.s
3b50: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
3b60: 65 72 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70  errcode(Pager *p
3b70: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
3b80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3b90: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
3ba0: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
3bb0: 4c 4f 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53  LOCK )    rc = S
3bc0: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a  QLITE_PROTOCOL;.
3bd0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
3be0: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
3bf0: 52 5f 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d  R_DISK )    rc =
3c00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
3c10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
3c20: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
3c30: 5f 46 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20  _FULL )    rc = 
3c40: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69  SQLITE_FULL;.  i
3c50: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
3c60: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d  sk & PAGER_ERR_M
3c70: 45 4d 20 29 20 20 20 20 20 72 63 20 3d 20 53 51  EM )     rc = SQ
3c80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66  LITE_NOMEM;.  if
3c90: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
3ca0: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  k & PAGER_ERR_CO
3cb0: 52 52 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c  RRUPT ) rc = SQL
3cc0: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72  ITE_CORRUPT;.  r
3cd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3ce0: 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65  ** Add or remove
3cf0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
3d00: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
3d10: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  es that are in t
3d20: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
3d30: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
3d40: 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61  he Pager keeps a
3d50: 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f   separate list o
3d60: 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  f pages that are
3d70: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a   currently in.**
3d80: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
3d90: 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65  ournal.  This he
3da0: 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 70  lps the sqlite3p
3db0: 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
3dc0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
3dd0: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
3de0: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
3df0: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
3e00: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
3e10: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
3e20: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
3e30: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
3e40: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
3e50: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
3e60: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
3e70: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
3e80: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
3e90: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
3ea0: 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75  g->inStmt ) retu
3eb0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rn;.  assert( pP
3ec0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20  g->pPrevStmt==0 
3ed0: 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  && pPg->pNextStm
3ee0: 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  t==0 );.  pPg->p
3ef0: 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20  PrevStmt = 0;.  
3f00: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  if( pPager->pStm
3f10: 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  t ){.    pPager-
3f20: 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  >pStmt->pPrevStm
3f30: 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  t = pPg;.  }.  p
3f40: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
3f50: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20  pPager->pStmt;. 
3f60: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
3f70: 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53   pPg;.  pPg->inS
3f80: 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69  tmt = 1;.}.stati
3f90: 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f  c void page_remo
3fa0: 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
3fb0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
3fc0: 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d   if( !pPg->inStm
3fd0: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  t ) return;.  if
3fe0: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
3ff0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4000: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e  pPg->pPrevStmt->
4010: 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29  pNextStmt==pPg )
4020: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
4030: 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Stmt->pNextStmt 
4040: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
4050: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
4060: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
4070: 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29  er->pStmt==pPg )
4080: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
4090: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e  r->pStmt = pPg->
40a0: 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20  pNextStmt;.  }. 
40b0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53   if( pPg->pNextS
40c0: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
40d0: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  t( pPg->pNextStm
40e0: 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50  t->pPrevStmt==pP
40f0: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  g );.    pPg->pN
4100: 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  extStmt->pPrevSt
4110: 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53  mt = pPg->pPrevS
4120: 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  tmt;.  }.  pPg->
4130: 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
4140: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
4150: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74  = 0;.  pPg->inSt
4160: 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mt = 0;.}../*.**
4170: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
4180: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
4190: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
41a0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
41b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
41c0: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
41d0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
41e0: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
41f0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
4200: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
4210: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
4220: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
4230: 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f  [pager_hash(pgno
4240: 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26  )];.  while( p &
4250: 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20  & p->pgno!=pgno 
4260: 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  ){.    p = p->pN
4270: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72  extHash;.  }.  r
4280: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
4290: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
42a0: 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20  abase and clear 
42b0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
42c0: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
42d0: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
42e0: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
42f0: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
4300: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
4310: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
4320: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
4330: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
4340: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
4350: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
4360: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
4370: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
4380: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
4390: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
43a0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
43b0: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
43c0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
43d0: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
43e0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
43f0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
4400: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
4410: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
4420: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
4430: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61  (pPg);.  }.  pPa
4440: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
4450: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
4460: 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70  tSynced = 0;.  p
4470: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
4480: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  ;.  pPager->pAll
4490: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70   = 0;.  memset(p
44a0: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
44b0: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
44c0: 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65  aHash));.  pPage
44d0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
44e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
44f0: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
4500: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
4510: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
4520: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
4530: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
4540: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
4550: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
4560: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
4570: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  OCK;.  pPager->d
4580: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50  bSize = -1;.  pP
4590: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
45a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
45b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
45c0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65   );.}../*.** Whe
45d0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
45e0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
45f0: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
4600: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
4610: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
4620: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
4630: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
4640: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
4650: 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65   releases.** the
4660: 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61   database lock a
4670: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48  nd acquires a SH
4680: 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73  ARED lock in its
4690: 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75   place.  The jou
46a0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20  rnal.** file is 
46b0: 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73  deleted and clos
46c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
46d0: 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67  Consider keeping
46e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
46f0: 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f  e open for tempo
4700: 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a  rary databases..
4710: 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69  ** This might gi
4720: 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
4730: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20   improvement on 
4740: 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70  windows where op
4750: 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20  ening.** a file 
4760: 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20  is an expensive 
4770: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
4780: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75  atic int pager_u
4790: 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72  nwritelock(Pager
47a0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
47b0: 64 72 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  dr *pPg;.  asser
47c0: 74 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  t( !pPager->memD
47d0: 62 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  b );.  if( pPage
47e0: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
47f0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
4800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4810: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61  .  }.  sqlite3pa
4820: 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
4830: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
4840: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
4850: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
4860: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73  Close(&pPager->s
4870: 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tfd);.    pPager
4880: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
4890: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
48a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
48b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
48c0: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
48d0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
48e0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
48f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
4900: 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
4910: 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  rnal);.    sqlit
4920: 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
4930: 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  InJournal );.   
4940: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
4950: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nal = 0;.    for
4960: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
4970: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
4980: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
4990: 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
49a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
49b0: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
49c0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
49d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
49e0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
49f0: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
4a00: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
4a10: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
4a20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
4a30: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
4a40: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
4a50: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  );.  pPager->sta
4a60: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
4a70: 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  D;.  return SQLI
4a80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4a90: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
4aa0: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
4ab0: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
4ac0: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
4ad0: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
4ae0: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
4af0: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
4b00: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
4b10: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
4b20: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
4b30: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
4b40: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
4b50: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
4b60: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
4b70: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
4b80: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
4b90: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
4ba0: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
4bb0: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
4bc0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
4bd0: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
4be0: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
4bf0: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
4c00: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
4c10: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
4c20: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
4c30: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
4c40: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
4c50: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
4c60: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
4c70: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
4c80: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
4c90: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
4ca0: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
4cb0: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
4cc0: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
4cd0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4ce0: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
4cf0: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
4d00: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
4d10: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
4d20: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
4d30: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
4d40: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
4d50: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
4d60: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
4d70: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
4d80: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
4d90: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
4da0: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
4db0: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
4dc0: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
4dd0: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
4de0: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
4df0: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
4e00: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
4e10: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
4e20: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
4e30: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
4e40: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
4e50: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
4e60: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
4e70: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
4e80: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
4e90: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
4ea0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
4eb0: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
4ec0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e  , Pgno pgno, con
4ed0: 73 74 20 63 68 61 72 20 2a 61 44 61 74 61 29 7b  st char *aData){
4ee0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
4ef0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
4f00: 20 2b 20 70 67 6e 6f 3b 0a 20 20 72 65 74 75 72   + pgno;.  retur
4f10: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
4f20: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
4f30: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  page from the jo
4f40: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65  urnal file opene
4f50: 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  d on file descri
4f60: 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c  ptor.** jfd.  Pl
4f70: 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20  ayback this one 
4f80: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75  page..**.** If u
4f90: 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65  seCksum==0 it me
4fa0: 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ans this journal
4fb0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68   does not use ch
4fc0: 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73  ecksums.  Checks
4fd0: 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75  ums.** are not u
4fe0: 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74  sed in statement
4ff0: 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73   journals becaus
5000: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
5010: 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e  nals do not.** n
5020: 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70  eed to survive p
5030: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a  ower failures..*
5040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
5050: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
5060: 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
5070: 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c  er, OsFile *jfd,
5080: 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a   int useCksum){.
5090: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
50a0: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
50b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
50c0: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
50d0: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
50e0: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5100: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
5110: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
5120: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
5130: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
5150: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
5160: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
5170: 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49  .  u8 aData[SQLI
5180: 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20  TE_PAGE_SIZE];  
5190: 20 2f 2a 20 53 74 6f 72 65 20 64 61 74 61 20 68   /* Store data h
51a0: 65 72 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 72  ere */..  rc = r
51b0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
51c0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
51d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
51e0: 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
51f0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
5200: 2c 20 26 61 44 61 74 61 2c 20 70 50 61 67 65 72  , &aData, pPager
5210: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  ->pageSize);.  i
5220: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5230: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5240: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
5250: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
5260: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
5270: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
5280: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
5290: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
52a0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
52b0: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
52c0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
52d0: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
52e0: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
52f0: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
5300: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
5310: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
5320: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
5330: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
5340: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
5350: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
5360: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
5370: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a   if( pgno==0 ){.
5380: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5390: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
53a0: 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64  ( pgno>(unsigned
53b0: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
53c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
53d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
53e0: 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20  f( useCksum ){. 
53f0: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
5400: 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b  ts(jfd, &cksum);
5410: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
5420: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
5430: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
5440: 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61  ger, pgno, aData
5450: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
5460: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5470: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
5480: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5490: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
54a0: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
54b0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
54c0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
54d0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
54e0: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
54f0: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
5500: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
5510: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
5520: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
5530: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
5540: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
5550: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
5560: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
5570: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
5580: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
5590: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
55a0: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
55b0: 2a 2a 20 46 49 58 20 4d 45 3a 20 49 64 65 61 6c  ** FIX ME: Ideal
55c0: 6c 79 20 74 68 65 20 70 61 67 65 20 77 6f 75 6c  ly the page woul
55d0: 64 20 6f 6e 6c 79 20 62 65 20 6c 65 66 74 20 6d  d only be left m
55e0: 61 72 6b 65 64 20 64 69 72 74 79 20 77 68 65 6e  arked dirty when
55f0: 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20   the.  ** pager 
5600: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
5610: 74 61 74 65 20 69 66 20 69 74 20 77 61 73 20 64  tate if it was d
5620: 69 72 74 79 20 77 68 65 6e 20 74 68 69 73 20 73  irty when this s
5630: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72  tatement.  ** tr
5640: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
5650: 61 72 74 65 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a  arted. .  **.  *
5660: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
5670: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
5680: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
5690: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
56a0: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
56b0: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
56c0: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
56d0: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
56e0: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67    */.  pPg = pag
56f0: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
5700: 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
5710: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
5720: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
5730: 45 20 7c 7c 20 70 50 67 20 29 3b 0a 20 20 54 52  E || pPg );.  TR
5740: 41 43 45 32 28 22 50 4c 41 59 42 41 43 4b 20 70  ACE2("PLAYBACK p
5750: 61 67 65 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 29  age %d\n", pgno)
5760: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
5770: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
5780: 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 73 71  LUSIVE ){.    sq
5790: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
57a0: 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
57b0: 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f  )*(off_t)SQLITE_
57c0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
57d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
57e0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
57f0: 20 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50   aData, SQLITE_P
5800: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a 20  AGE_SIZE);.  }. 
5810: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
5820: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
5830: 64 20 65 76 65 72 20 62 65 20 72 6f 6c 6c 65 64  d ever be rolled
5840: 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
5850: 20 75 73 65 2c 20 65 78 63 65 70 74 20 66 6f 72   use, except for
5860: 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 31 20 77   page.    ** 1 w
5870: 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
5880: 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
5890: 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
58a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
58b0: 20 20 2a 2a 20 61 63 74 69 76 65 2e 0a 20 20 20    ** active..   
58c0: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
58d0: 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
58e0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
58f0: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
5900: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48  .    pData = PGH
5910: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
5920: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
5930: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
5940: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
5950: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
5960: 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a  structor ){  /**
5970: 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c  * FIX ME:  Shoul
5980: 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69  d this be xReini
5990: 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50  t? ***/.      pP
59a0: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
59b0: 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  r(pData, pPager-
59c0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
59d0: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
59e0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
59f0: 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
5a00: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
5a10: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
5a20: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
5a30: 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65  .    CODEC(pPage
5a40: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
5a50: 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72  gno, 3);.  }.  r
5a60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5a70: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
5a80: 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
5a90: 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
5aa0: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
5ab0: 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
5ac0: 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
5ad0: 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
5ae0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
5af0: 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
5b00: 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
5b10: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
5b20: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
5b30: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
5b40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5b50: 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
5b60: 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
5b70: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
5b80: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
5b90: 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
5ba0: 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e   all child journ
5bb0: 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20  als..** To tell 
5bc0: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
5bd0: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
5be0: 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63  ed, check to eac
5bf0: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c  h of the.** chil
5c00: 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68  dren.  If all ch
5c10: 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65  ildren are eithe
5c20: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20  r missing or do 
5c30: 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  not refer to.** 
5c40: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
5c50: 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  er journal, then
5c60: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
5c70: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
5c80: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
5c90: 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
5ca0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
5cb0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
5cc0: 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f  c;.  int master_
5cd0: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69  open = 0;.  OsFi
5ce0: 6c 65 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61  le master;.  cha
5cf0: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
5d00: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
5d10: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
5d20: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 6f  rnal file */.  o
5d30: 66 66 5f 74 20 6e 4d 61 73 74 65 72 4a 6f 75 72  ff_t nMasterJour
5d40: 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  nal;     /* Size
5d50: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
5d60: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
5d70: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
5d80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
5d90: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
5da0: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
5db0: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
5dc0: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
5dd0: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
5de0: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
5df0: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
5e00: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61   */.  memset(&ma
5e10: 73 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ster, 0, sizeof(
5e20: 6d 61 73 74 65 72 29 29 3b 0a 20 20 72 63 20 3d  master));.  rc =
5e30: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
5e40: 63 6c 75 73 69 76 65 28 7a 4d 61 73 74 65 72 2c  clusive(zMaster,
5e50: 20 26 6d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   &master, 0);.  
5e60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5e70: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
5e80: 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72  er_out;.  master
5e90: 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20  _open = 1;.  rc 
5ea0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
5eb0: 69 7a 65 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d  ize(&master, &nM
5ec0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
5ed0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5ee0: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
5ef0: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20  ter_out;..  if( 
5f00: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30  nMasterJournal>0
5f10: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a   ){.    char *zJ
5f20: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72  ournal;.    char
5f30: 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 0a 20 20   *zMasterPtr;.  
5f40: 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
5f50: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
5f60: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
5f70: 20 61 74 20 7a 4d 61 73 74 65 72 50 74 72 20 2a   at zMasterPtr *
5f80: 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  /..    /* Load t
5f90: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
5fa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
5fb0: 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
5fc0: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
5fd0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
5fe0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
5ff0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a  MasterJournal. .
6000: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
6010: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 65  so allocate an e
6020: 78 74 72 61 20 28 73 74 72 6c 65 6e 28 7a 4d 61  xtra (strlen(zMa
6030: 73 74 65 72 29 2b 31 29 20 62 79 74 65 73 2e 20  ster)+1) bytes. 
6040: 54 68 69 73 20 73 70 61 63 65 20 69 73 20 75 73  This space is us
6050: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 6c 6f 61  ed.    ** to loa
6060: 64 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  d a master-journ
6070: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d  al filename from
6080: 20 73 6f 6d 65 20 6f 74 68 65 72 20 6a 6f 75 72   some other jour
6090: 6e 61 6c 20 66 69 6c 65 20 74 6f 0a 20 20 20 20  nal file to.    
60a0: 2a 2a 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  ** check if it p
60b0: 6f 69 6e 74 73 20 61 74 20 74 68 69 73 20 6d 61  oints at this ma
60c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
60d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4d  e..    */.    nM
60e0: 61 73 74 65 72 50 74 72 20 3d 20 73 74 72 6c 65  asterPtr = strle
60f0: 6e 28 7a 4d 61 73 74 65 72 29 20 2b 20 31 3b 0a  n(zMaster) + 1;.
6100: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
6110: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
6120: 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  iteMalloc(nMaste
6130: 72 4a 6f 75 72 6e 61 6c 29 20 2b 20 6e 4d 61 73  rJournal) + nMas
6140: 74 65 72 50 74 72 3b 0a 20 20 20 20 69 66 28 20  terPtr;.    if( 
6150: 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
6160: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6170: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6180: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
6190: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
61a0: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
61b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
61c0: 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20  sterJournal];.  
61d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
61e0: 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20 7a 4d  Read(&master, zM
61f0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d  asterJournal, nM
6200: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
6210: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6220: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
6230: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20  aster_out;..    
6240: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
6250: 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
6260: 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
6270: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
6280: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
6290: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
62a0: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
62b0: 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
62c0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
62d0: 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
62e0: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
62f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
6300: 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
6310: 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
6320: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
6330: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
6340: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
6350: 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
6360: 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
6370: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6380: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
6390: 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69   */.        OsFi
63a0: 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  le journal;.    
63b0: 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b      int nMaster;
63c0: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 6a  .        off_t j
63d0: 73 7a 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  sz;..        mem
63e0: 73 65 74 28 26 6a 6f 75 72 6e 61 6c 2c 20 30 2c  set(&journal, 0,
63f0: 20 73 69 7a 65 6f 66 28 6a 6f 75 72 6e 61 6c 29   sizeof(journal)
6400: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
6410: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
6420: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
6430: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
6440: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6450: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6460: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
6470: 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (&journal);.    
6480: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
6490: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
64a0: 20 20 7d 0a 0a 09 2f 2a 20 43 68 65 63 6b 20 69    }.../* Check i
64b0: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 69  f the file is bi
64c0: 67 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 61  g enough to be a
64d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
64e0: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
64f0: 65 20 72 65 71 75 69 72 65 64 20 6d 61 73 74 65  e required maste
6500: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
6510: 49 66 20 6e 6f 74 2c 20 69 67 6e 6f 72 65 20 69  If not, ignore i
6520: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
6530: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6540: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6a 6f  e3OsFileSize(&jo
6550: 75 72 6e 61 6c 2c 20 26 6a 73 7a 29 3b 0a 20 20  urnal, &jsz);.  
6560: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
6570: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6580: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
6590: 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(&journal);. 
65a0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
65b0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
65c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
65d0: 66 28 20 6a 73 7a 3c 28 32 35 2b 73 74 72 6c 65  f( jsz<(25+strle
65e0: 6e 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20  n(zMaster)) ){. 
65f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6600: 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c  OsClose(&journal
6610: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
6620: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
6630: 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
6640: 20 20 2f 2a 20 53 65 65 6b 20 74 6f 20 74 68 65    /* Seek to the
6650: 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 6a 6f   point in the jo
6660: 75 72 6e 61 6c 20 77 68 65 72 65 20 74 68 65 20  urnal where the 
6670: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6680: 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ame.        ** i
6690: 73 20 73 74 6f 72 65 64 2e 20 52 65 61 64 20 74  s stored. Read t
66a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
66b0: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f  l name into memo
66c0: 72 79 20 6f 62 74 61 69 6e 65 64 0a 20 20 20 20  ry obtained.    
66d0: 20 20 20 20 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c      ** from mall
66e0: 6f 63 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  oc..        */. 
66f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
6700: 74 65 33 4f 73 53 65 65 6b 28 26 6a 6f 75 72 6e  te3OsSeek(&journ
6710: 61 6c 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20  al, 20);.       
6720: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6730: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
6740: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
6750: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6760: 28 26 6a 6f 75 72 6e 61 6c 2c 20 28 75 33 32 2a  (&journal, (u32*
6770: 29 26 6e 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  )&nMaster);.    
6780: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6790: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
67a0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
67b0: 20 20 20 20 69 66 28 20 6e 4d 61 73 74 65 72 3e      if( nMaster>
67c0: 3d 6e 4d 61 73 74 65 72 50 74 72 20 29 7b 0a 20  =nMasterPtr ){. 
67d0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
67e0: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 6a 6f 75  lite3OsRead(&jou
67f0: 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
6800: 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
6810: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
6820: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6830: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
6840: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
6850: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6860: 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 50      if( zMasterP
6870: 74 72 5b 6e 4d 61 73 74 65 72 50 74 72 2d 31 5d  tr[nMasterPtr-1]
6880: 3d 3d 27 5c 30 27 20 26 26 20 21 73 74 72 63 6d  =='\0' && !strcm
6890: 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d  p(zMasterPtr, zM
68a0: 61 73 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20  aster) ){.      
68b0: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
68c0: 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
68d0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
68e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
68f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6900: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
6910: 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
6920: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6930: 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  }.      zJournal
6940: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75   += (strlen(zJou
6950: 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
6960: 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33    }.  .  sqlite3
6970: 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72  OsDelete(zMaster
6980: 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
6990: 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
69a0: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
69b0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
69c0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
69d0: 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70  .  if( master_op
69e0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
69f0: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72  3OsClose(&master
6a00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6a10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
6a20: 65 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20  e every page in 
6a30: 74 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20  the cache agree 
6a40: 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20  with what is on 
6a50: 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  disk.  In other 
6a60: 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64  words,.** reread
6a70: 20 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73   the disk to res
6a80: 65 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  et the state of 
6a90: 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
6aa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6ab0: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20   called after a 
6ac0: 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63  rollback in whic
6ad0: 68 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69  h some of the di
6ae0: 72 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67  rty cache.** pag
6af0: 65 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65  es had never bee
6b00: 6e 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  n written out to
6b10: 20 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20   disk.  We need 
6b20: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
6b30: 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e  .** cache conten
6b40: 74 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73  t and the easies
6b50: 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74  t way to do that
6b60: 20 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68   is to reread th
6b70: 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a  e old content.**
6b80: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64   back from the d
6b90: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
6ba0: 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  nt pager_reload_
6bb0: 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
6bc0: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
6bd0: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
6be0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28  QLITE_OK;.  for(
6bf0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
6c00: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
6c10: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63  pNextAll){.    c
6c20: 68 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f  har zBuf[SQLITE_
6c30: 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20  PAGE_SIZE];.    
6c40: 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20  if( !pPg->dirty 
6c50: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6c60: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
6c70: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
6c80: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
6c90: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
6ca0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  &pPager->fd, SQL
6cb0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f  ITE_PAGE_SIZE*(o
6cc0: 66 66 5f 74 29 28 70 50 67 2d 3e 70 67 6e 6f 2d  ff_t)(pPg->pgno-
6cd0: 31 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  1));.      rc = 
6ce0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
6cf0: 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
6d00: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
6d10: 45 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32  E);.      TRACE2
6d20: 28 22 52 45 46 45 54 43 48 20 70 61 67 65 20 25  ("REFETCH page %
6d30: 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  d\n", pPg->pgno)
6d40: 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
6d50: 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d  ager, zBuf, pPg-
6d60: 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 20  >pgno, 2);.     
6d70: 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
6d80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6d90: 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
6da0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
6db0: 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ZE);.    }.    i
6dc0: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
6dd0: 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  || memcmp(zBuf, 
6de0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
6df0: 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g), SQLITE_PAGE_
6e00: 53 49 5a 45 29 20 29 7b 0a 20 20 20 20 20 20 6d  SIZE) ){.      m
6e10: 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
6e20: 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20  ATA(pPg), zBuf, 
6e30: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
6e40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
6e50: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
6e60: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
6e70: 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44  ->xReiniter(PGHD
6e80: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
6e90: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
6ea0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6eb0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
6ec0: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
6ed0: 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  g), 0, pPager->n
6ee0: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a  Extra);.      }.
6ef0: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e      }.    pPg->n
6f00: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
6f10: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
6f20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6f30: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ;.}.../*.** Play
6f40: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
6f50: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
6f60: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
6f70: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
6f80: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
6f90: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
6fa0: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
6fb0: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
6fc0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
6fd0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
6fe0: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
6ff0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
7000: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
7010: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
7020: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
7030: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
7040: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
7050: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
7060: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
7070: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
7080: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
7090: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
70a0: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
70b0: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
70c0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
70d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
70e0: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
70f0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
7100: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
7110: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
7120: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
7130: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
7140: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
7150: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
7160: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
7170: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
7180: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
7190: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
71a0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
71b0: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
71c0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
71d0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
71e0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
71f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
7200: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
7210: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
7220: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
7230: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
7240: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
7250: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
7260: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
7270: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7280: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
7290: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
72a0: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
72b0: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
72c0: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
72d0: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
72e0: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
72f0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
7300: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
7310: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
7320: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
7330: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
7340: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
7350: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
7360: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
7370: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
7380: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
7390: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
73a0: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
73b0: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
73c0: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
73d0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
73e0: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
73f0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
7400: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
7410: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
7420: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
7430: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
7440: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
7450: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
7460: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
7470: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
7480: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
7490: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
74a0: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
74b0: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
74c0: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
74d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
74e0: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
74f0: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
7500: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
7510: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
7520: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
7530: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
7540: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
7550: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
7560: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
7570: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
7580: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
7590: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
75a0: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
75b0: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
75c0: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
75d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
75e0: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
75f0: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
7600: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
7610: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
7620: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
7630: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
7640: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
7650: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
7660: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
7670: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
7680: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
7690: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
76a0: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
76b0: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
76c0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
76d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
76e0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
76f0: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
7700: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
7710: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
7720: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
7730: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
7740: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
7750: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
7760: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
7770: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
7780: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
7790: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
77a0: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
77b0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
77c0: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
77d0: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
77e0: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
77f0: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
7800: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
7810: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
7820: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
7830: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
7840: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
7850: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
7860: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
7870: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
7880: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69   the database wi
7890: 6c 6c 20 6c 69 6b 65 6c 79 20 61 6c 72 65 61 64  ll likely alread
78a0: 79 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  y be.** corrupte
78b0: 64 2c 20 73 6f 20 74 68 65 20 50 41 47 45 52 5f  d, so the PAGER_
78c0: 45 52 52 5f 43 4f 52 52 55 50 54 20 62 69 74 20  ERR_CORRUPT bit 
78d0: 69 73 20 73 65 74 20 69 6e 20 70 50 61 67 65 72  is set in pPager
78e0: 2d 3e 65 72 72 4d 61 73 6b 0a 2a 2a 20 61 6e 64  ->errMask.** and
78f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
7900: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
7910: 20 69 74 20 61 6c 6c 20 77 6f 72 6b 73 2c 20 74   it all works, t
7920: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
7930: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 53 51 4c 49  .** returns SQLI
7940: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
7950: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
7960: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
7970: 72 2c 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  r, int useJourna
7980: 6c 53 69 7a 65 29 7b 0a 20 20 6f 66 66 5f 74 20  lSize){.  off_t 
7990: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
79a0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
79b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
79c0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
79d0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
79e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
79f0: 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
7a00: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  e journal */.  i
7a10: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7a20: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
7a30: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
7a40: 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
7a50: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
7a60: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
7a70: 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
7a80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
7a90: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
7aa0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
7ab0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
7ac0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ae0: 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
7af0: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
7b00: 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
7b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7b20: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
7b30: 74 68 65 20 6e 61 6d 65 20 6f 66 20 6d 61 73 74  the name of mast
7b40: 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
7b50: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
7b60: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
7b70: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
7b80: 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
7b90: 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
7ba0: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
7bb0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
7bc0: 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
7bd0: 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
7be0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
7bf0: 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
7c00: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
7c10: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
7c20: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
7c30: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 72 63 20  ->jfd, 0);.  rc 
7c40: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
7c50: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
7c60: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
7c70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7c80: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
7c90: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
7ca0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
7cb0: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
7cc0: 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 63  l to contain a c
7cd0: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 0a  omplete header,.
7ce0: 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 6d 65 61    ** it must mea
7cf0: 6e 20 74 68 61 74 20 74 68 65 20 70 72 6f 63 65  n that the proce
7d00: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
7d10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
7d20: 6a 75 73 74 0a 20 20 2a 2a 20 62 65 67 69 6e 6e  just.  ** beginn
7d30: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 68 65  ing to write the
7d40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
7d50: 65 6e 20 69 74 20 64 69 65 64 2e 20 20 49 6e 20  en it died.  In 
7d60: 74 68 61 74 20 63 61 73 65 2c 0a 20 20 2a 2a 20  that case,.  ** 
7d70: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7d80: 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 73 74  e should have st
7d90: 69 6c 6c 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74  ill been complet
7da0: 65 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ely unchanged.. 
7db0: 20 2a 2a 20 4e 6f 74 68 69 6e 67 20 6e 65 65 64   ** Nothing need
7dc0: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
7dd0: 61 63 6b 2e 20 20 57 65 20 63 61 6e 20 73 61 66  ack.  We can saf
7de0: 65 6c 79 20 69 67 6e 6f 72 65 20 74 68 69 73 20  ely ignore this 
7df0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
7e00: 69 66 28 20 73 7a 4a 20 3c 20 32 34 20 29 7b 0a  if( szJ < 24 ){.
7e10: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
7e20: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
7e30: 20 28 31 29 20 52 65 61 64 20 74 68 65 20 62 65   (1) Read the be
7e40: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  ginning of the j
7e50: 6f 75 72 6e 61 6c 20 61 6e 64 20 76 65 72 69 66  ournal and verif
7e60: 79 20 74 68 65 20 6d 61 67 69 63 20 73 74 72 69  y the magic stri
7e70: 6e 67 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62  ng.  ** at the b
7e80: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
7e90: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 72 63  journal. */.  rc
7ea0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
7eb0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
7ec0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
7ed0: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
7ee0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
7ef0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
7f00: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
7f10: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
7f20: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
7f30: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20  TE_PROTOCOL;.   
7f40: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
7f50: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 28 32  ck;.  }..  /* (2
7f60: 29 20 52 65 61 64 20 74 68 65 20 6e 75 6d 62 65  ) Read the numbe
7f70: 72 20 6f 66 20 70 61 67 65 73 20 73 74 6f 72 65  r of pages store
7f80: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
7f90: 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
7fa0: 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  d32bits(&pPager-
7fb0: 3e 6a 66 64 2c 20 28 75 33 32 2a 29 26 6e 52 65  >jfd, (u32*)&nRe
7fc0: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  c);.  if( rc ) g
7fd0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
7fe0: 3b 0a 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78  ;.  if( nRec==0x
7ff0: 66 66 66 66 66 66 66 66 20 7c 7c 20 75 73 65 4a  ffffffff || useJ
8000: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
8010: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
8020: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8030: 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
8040: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
8050: 20 7d 0a 0a 20 20 2f 2a 20 28 33 29 20 52 65 61   }..  /* (3) Rea
8060: 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  d the initial va
8070: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 61 6e 69  lue for the sani
8080: 74 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ty checksum */. 
8090: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
80a0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
80b0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
80c0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  t);.  if( rc ) g
80d0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
80e0: 3b 0a 0a 20 20 2f 2a 20 28 34 29 20 52 65 61 64  ;..  /* (4) Read
80f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
8100: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
8110: 62 61 73 65 20 66 69 6c 65 20 70 72 69 6f 72 20  base file prior 
8120: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72  to the.  ** star
8130: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
8140: 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 72  tion */.  rc = r
8150: 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65  ead32bits(&pPage
8160: 72 2d 3e 6a 66 64 2c 20 26 6d 78 50 67 29 3b 0a  r->jfd, &mxPg);.
8170: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8180: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
8190: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
81a0: 7d 0a 0a 20 20 2f 2a 20 28 35 29 20 61 6e 64 20  }..  /* (5) and 
81b0: 28 36 29 3a 20 43 68 65 63 6b 20 69 66 20 61 20  (6): Check if a 
81c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
81d0: 69 6c 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ile is specified
81e0: 2e 20 49 66 20 6f 6e 65 20 69 73 0a 20 20 2a 2a  . If one is.  **
81f0: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79   specified, only
8200: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68   proceed with th
8210: 65 20 70 6c 61 79 62 61 63 6b 20 69 66 20 69 74  e playback if it
8220: 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 20 2a   still exists. *
8230: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  /.  rc = read32b
8240: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
8250: 2c 20 26 6e 4d 61 73 74 65 72 29 3b 0a 20 20 69  , &nMaster);.  i
8260: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
8270: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 69 66 28  _playback;.  if(
8280: 20 6e 4d 61 73 74 65 72 3e 30 20 29 7b 0a 20 20   nMaster>0 ){.  
8290: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
82a0: 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  teMalloc(nMaster
82b0: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
82c0: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
82d0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
82e0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
82f0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
8300: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8310: 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a  sRead(&pPager->j
8320: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
8330: 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ster);.    if( r
8340: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
8350: 28 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 21  (zMaster[0] && !
8360: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
8370: 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b  sts(zMaster)) ){
8380: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
8390: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
83a0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61    }..  /* Trunca
83b0: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
83c0: 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27  file back to it'
83d0: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20  s original size 
83e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
83f0: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d  ger->origDbSize=
8400: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72  =0 || pPager->or
8410: 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29  igDbSize==mxPg )
8420: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8430: 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67  OsTruncate(&pPag
8440: 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50  er->fd, SQLITE_P
8450: 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29  AGE_SIZE*(off_t)
8460: 6d 78 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21  mxPg);.  if( rc!
8470: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8480: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
8490: 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
84a0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
84b0: 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
84c0: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
84d0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
84e0: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
84f0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8500: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
8510: 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a  ; i<nRec; i++){.
8520: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
8530: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
8540: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
8550: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 69  ->jfd, 1);.    i
8560: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8570: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
8580: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
8590: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
85a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
85b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
85c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61    }.  }..  /* Pa
85d0: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ges that have be
85e0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
85f0: 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65  e journal but ne
8600: 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  ver synced.  ** 
8610: 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72  where not restor
8620: 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61  ed by the loop a
8630: 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74  bove.  We have t
8640: 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a  o restore those.
8650: 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65    ** pages by re
8660: 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20  ading them back 
8670: 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
8680: 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  l database..  */
8690: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
86a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67 65  E_OK ){.    page
86b0: 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
86c0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 65 6e 64  Pager);.  }..end
86d0: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
86e0: 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   zMaster ){.    
86f0: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
8700: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
8710: 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
8720: 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72  e will return tr
8730: 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ue,.    ** see i
8740: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
8750: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
8760: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
8770: 66 20 65 72 72 6f 72 73 20 0a 20 20 20 20 2a 2a  f errors .    **
8780: 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74 68   occur during th
8790: 69 73 20 70 72 6f 63 65 73 73 2c 20 69 67 6e 6f  is process, igno
87a0: 72 65 20 74 68 65 6d 2e 0a 20 20 20 20 2a 2f 0a  re them..    */.
87b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
87c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
87d0: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a  ager_delmaster(z
87e0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Master);.    }. 
87f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
8800: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  aster);.  }.  if
8810: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8820: 29 7b 0a 20 20 20 20 2f 2a 20 46 49 58 20 4d 45  ){.    /* FIX ME
8830: 3a 20 57 65 20 73 68 6f 75 6c 64 6e 27 74 20 64  : We shouldn't d
8840: 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
8850: 6c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  l if an error oc
8860: 63 75 72 65 64 20 64 75 72 69 6e 67 0a 20 20 20  cured during.   
8870: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74   ** rollback. It
8880: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 61   may have been a
8890: 20 74 72 61 6e 73 69 65 6e 74 20 65 72 72 6f 72   transient error
88a0: 20 61 6e 64 20 74 68 65 20 72 6f 6c 6c 62 61 63   and the rollbac
88b0: 6b 20 6d 61 79 0a 20 20 20 20 2a 2a 20 73 75 63  k may.    ** suc
88c0: 63 65 65 64 20 6e 65 78 74 20 74 69 6d 65 20 69  ceed next time i
88d0: 74 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 0a  t is attempted..
88e0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 61 67 65 72      */.    pager
88f0: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
8900: 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
8910: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
8920: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
8930: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8940: 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65  CORRUPT;.  }else
8950: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
8960: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
8970: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
8980: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8990: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61  Playback the sta
89a0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
89b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
89c0: 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
89d0: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
89e0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
89f0: 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
8a00: 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
8a10: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
8a20: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
8a30: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
8a40: 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
8a50: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
8a60: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
8a70: 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
8a80: 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74  r->stmtSize, not
8a90: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
8aa0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
8ab0: 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20  itself..**.**   
8ac0: 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f   (2)  In additio
8ad0: 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  n to playing bac
8ae0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
8af0: 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a  journal, also.**
8b00: 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63           playbac
8b10: 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  k all pages of t
8b20: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
8b30: 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67  ournal beginning
8b40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f  .**         at o
8b50: 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74  ffset pPager->st
8b60: 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  mtJSize..*/.stat
8b70: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d  ic int pager_stm
8b80: 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  t_playback(Pager
8b90: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66   *pPager){.  off
8ba0: 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  _t szJ;         
8bb0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8bc0: 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
8bd0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  l */.  int nRec;
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
8c00: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8c30: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
8c40: 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
8c50: 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
8c60: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
8c70: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
8c80: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
8c90: 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  cate(&pPager->fd
8ca0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
8cb0: 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61 67 65 72  ZE*(off_t)pPager
8cc0: 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 70  ->stmtSize);.  p
8cd0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
8ce0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
8cf0: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
8d00: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
8d10: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  rds are in the s
8d20: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8d30: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
8d40: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
8d50: 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  se && pPager->jo
8d60: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
8d70: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
8d80: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
8d90: 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d    nRec = pPager-
8da0: 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20  >stmtNRec;.  .  
8db0: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
8dc0: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
8dd0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
8de0: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
8df0: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
8e00: 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20  ase file.  Note 
8e10: 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
8e20: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73  nt journal omits
8e30: 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a   checksums from.
8e40: 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64    ** each record
8e50: 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69   since power-fai
8e60: 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73  lure recovery is
8e70: 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74   not important t
8e80: 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  o statement.  **
8e90: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a   journals..  */.
8ea0: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
8eb0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
8ec0: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
8ed0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
8ee0: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  ger, &pPager->st
8ef0: 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  fd, 0);.    asse
8f00: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
8f10: 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
8f20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
8f30: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
8f40: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
8f50: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
8f60: 6d 61 6e 79 20 70 61 67 65 73 20 6e 65 65 64 20  many pages need 
8f70: 74 6f 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74  to be copied out
8f80: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
8f90: 69 6f 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ion.  ** journal
8fa0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
8fb0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
8fc0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
8fd0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
8fe0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8ff0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
9000: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
9010: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
9020: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
9030: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
9040: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9050: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
9060: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
9070: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63  back;.  }.  nRec
9080: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
9090: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 2f 4a 4f 55  ->stmtJSize)/JOU
90a0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
90b0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63  r);.  for(i=nRec
90c0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
90d0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
90e0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
90f0: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
9100: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 69  ->jfd, 1);.    i
9110: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9120: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
9130: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
9140: 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
9150: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
9160: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  k;.    }.  }.  .
9170: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
9180: 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  k:.  if( rc!=SQL
9190: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
91a0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
91b0: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
91c0: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
91d0: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ITE_CORRUPT;.  }
91e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
91f0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
9200: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
9210: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
9220: 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
9230: 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  owed..**.** The 
9240: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 69  maximum number i
9250: 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76  s the absolute v
9260: 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 78 50 61  alue of the mxPa
9270: 67 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  ge parameter..**
9280: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
9290: 67 61 74 69 76 65 2c 20 74 68 65 20 6e 6f 53 79  gative, the noSy
92a0: 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20  nc flag is also 
92b0: 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79 70  set.  noSync byp
92c0: 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20 74  asses.** calls t
92d0: 6f 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  o sqlite3OsSync(
92e0: 29 2e 20 20 54 68 65 20 70 61 67 65 72 20 72 75  ).  The pager ru
92f0: 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 77  ns much faster w
9300: 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a  ith noSync on,.*
9310: 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f 70 65  * but if the ope
9320: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
9330: 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
9340: 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  s an abrupt powe
9350: 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20 74  r .** failure, t
9360: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9370: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
9380: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
9390: 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61 69  t and.** unrepai
93a0: 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20 0a 2a  rable state.  .*
93b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
93c0: 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a  ger_set_cachesiz
93d0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
93e0: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
93f0: 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b  if( mxPage>=0 ){
9400: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
9410: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
9420: 6d 70 46 69 6c 65 3b 0a 20 20 20 20 69 66 28 20  mpFile;.    if( 
9430: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
9440: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
9450: 63 20 3d 20 30 3b 20 0a 20 20 7d 65 6c 73 65 7b  c = 0; .  }else{
9460: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
9470: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78 50  ync = 1;.    mxP
9480: 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a 20  age = -mxPage;. 
9490: 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e   }.  if( mxPage>
94a0: 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
94b0: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
94c0: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
94d0: 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
94e0: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
94f0: 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
9500: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
9510: 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
9520: 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
9530: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
9540: 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
9550: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
9560: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
9570: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
9580: 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
9590: 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
95a0: 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
95b0: 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
95c0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
95d0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
95e0: 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
95f0: 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
9600: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
9610: 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
9620: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
9630: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
9640: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
9660: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
9670: 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
9680: 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
9690: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
96a0: 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
96b0: 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
96c0: 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
96d0: 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
96e0: 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
96f0: 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
9700: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
9710: 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
9720: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9730: 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
9740: 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
9750: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
9760: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
9770: 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
9780: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
9790: 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
97a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
97b0: 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
97c0: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
97d0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
97e0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
97f0: 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
9800: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
9810: 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
9820: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
9830: 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
9840: 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
9850: 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
9860: 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
9870: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
9880: 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
9890: 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
98a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
98b0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
98c0: 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
98d0: 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
98e0: 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
98f0: 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
9900: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
9910: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
9920: 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
9940: 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
9950: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
9960: 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
9970: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
9980: 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
9990: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
99a0: 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
99b0: 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
99c0: 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
99d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
99e0: 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65  er_set_safety_le
99f0: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
9a00: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20  r, int level){. 
9a10: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
9a20: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
9a30: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
9a40: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
9a50: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
9a60: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
9a70: 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
9a80: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
9a90: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
9aa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
9ab0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
9ac0: 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  .  Write the nam
9ad0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  e of the file in
9ae0: 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61  to zName.** (zNa
9af0: 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  me must be at le
9b00: 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ast SQLITE_TEMPN
9b10: 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c  AME_SIZE bytes l
9b20: 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20  ong.)  Write.** 
9b30: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
9b40: 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52  tor into *fd.  R
9b50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
9b60: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f  on success or so
9b70: 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f  me.** other erro
9b80: 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
9b90: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20  l..**.** The OS 
9ba0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
9bb0: 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
9bc0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
9bd0: 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  n it is.** close
9be0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
9bf0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
9c00: 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69  entemp(char *zFi
9c10: 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b  le, OsFile *fd){
9c20: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a  .  int cnt = 8;.
9c30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a    int rc;.  do{.
9c40: 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73      cnt--;.    s
9c50: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
9c60: 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  Name(zFile);.   
9c70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
9c80: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69  penExclusive(zFi
9c90: 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77  le, fd, 1);.  }w
9ca0: 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72  hile( cnt>0 && r
9cb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
9cc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9cd0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
9ce0: 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
9cf0: 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
9d00: 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
9d10: 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
9d20: 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
9d30: 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
9d40: 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
9d50: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
9d60: 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
9d70: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
9d80: 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e  e3pager_get() an
9d90: 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f  d is only held o
9da0: 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  pen until the.**
9db0: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
9dc0: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
9dd0: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
9de0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
9df0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
9e00: 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
9e10: 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
9e20: 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
9e30: 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
9e40: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
9e50: 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
9e60: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
9e70: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
9e80: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
9e90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9ea0: 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61  pager_open(.  Pa
9eb0: 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
9ec0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
9ed0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
9ee0: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
9ef0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
9f00: 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
9f10: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
9f20: 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
9f30: 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20 20    int mxPage,   
9f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
9f50: 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  x number of in-m
9f60: 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
9f70: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
9f80: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
9f90: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
9fa0: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
9fb0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
9fc0: 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
9fd0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52  ,          /* TR
9fe0: 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f 6c 6c  UE to use a roll
9ff0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20  back journal on 
a000: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 76  this file */.  v
a010: 6f 69 64 20 20 2a 70 42 75 73 79 48 61 6e 64 6c  oid  *pBusyHandl
a020: 65 72 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20  er      /* Busy 
a030: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  callback */.){. 
a040: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
a050: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
a060: 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  hname = 0;.  int
a070: 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69   nameLen;.  OsFi
a080: 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 20  le fd;.  int rc 
a090: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
a0a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
a0b0: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
a0c0: 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
a0d0: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
a0e0: 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
a0f0: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
a100: 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ];..  *ppPager =
a110: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 66 64   0;.  memset(&fd
a120: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29  , 0, sizeof(fd))
a130: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
a140: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b  malloc_failed ){
a150: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a160: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
a170: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
a180: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
a190: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
a1a0: 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
a1b0: 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
a1c0: 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
a1d0: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
a1e0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
a1f0: 22 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "");.      rc = 
a200: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
a210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 46 75 6c  else{.      zFul
a220: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
a230: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
a240: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
a250: 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74      if( zFullPat
a260: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
a270: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
a280: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
a290: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
a2a0: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
a2b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
a2c0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
a2d0: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
a2e0: 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a  mp(zTemp, &fd);.
a2f0: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
a300: 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c  zTemp;.    zFull
a310: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
a320: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
a330: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
a340: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a350: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70  OK ){.      temp
a360: 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  File = 1;.    }.
a370: 20 20 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c 6c    }.  if( !zFull
a380: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
a390: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a3a0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  MEM;.  }.  if( r
a3b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a3c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
a3d0: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  se(&fd);.    sql
a3e0: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
a3f0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
a400: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 61 6d  rn rc;.  }.  nam
a410: 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46  eLen = strlen(zF
a420: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
a430: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
a440: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
a450: 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
a460: 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28  *3 + 30 );.  if(
a470: 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20   pPager==0 ){.  
a480: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a490: 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&fd);.    sqlit
a4a0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
a4b0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
a4c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a4d0: 20 7d 0a 20 20 53 45 54 5f 50 41 47 45 52 28 70   }.  SET_PAGER(p
a4e0: 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
a4f0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
a500: 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  har*)&pPager[1];
a510: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  .  pPager->zDire
a520: 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d  ctory = &pPager-
a530: 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c  >zFilename[nameL
a540: 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  en+1];.  pPager-
a550: 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
a560: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
a570: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74  nameLen+1];.  st
a580: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  rcpy(pPager->zFi
a590: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
a5a0: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
a5b0: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
a5c0: 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ory, zFullPathna
a5d0: 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d  me);.  for(i=nam
a5e0: 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61  eLen; i>0 && pPa
a5f0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
a600: 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
a610: 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
a620: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
a630: 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72  [i-1] = 0;.  str
a640: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
a650: 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  rnal, zFullPathn
a660: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
a670: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
a680: 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61  );.  strcpy(&pPa
a690: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61  ger->zJournal[na
a6a0: 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61  meLen], "-journa
a6b0: 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  l");.  pPager->f
a6c0: 64 20 3d 20 66 64 3b 0a 20 20 70 50 61 67 65 72  d = fd;.  pPager
a6d0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
a6e0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  0;.  pPager->use
a6f0: 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75  Journal = useJou
a700: 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a  rnal && !memDb;.
a710: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
a720: 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  en = 0;.  pPager
a730: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
a740: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
a750: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
a760: 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
a770: 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
a780: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 50 41 47  ize = SQLITE_PAG
a790: 45 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72  E_SIZE;.  pPager
a7a0: 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a  ->stmtSize = 0;.
a7b0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
a7c0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
a7d0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
a7e0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
a7f0: 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50 61   mxPage>5 ? mxPa
a800: 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67 65  ge : 10;.  pPage
a810: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
a820: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
a830: 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a  r->errMask = 0;.
a840: 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
a850: 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
a860: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
a870: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
a880: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
a890: 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d  dOnly;.  pPager-
a8a0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
a8b0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
a8c0: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
a8d0: 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
a8e0: 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  l;.  pPager->pFi
a8f0: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
a900: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
a910: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
a920: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Last = 0;.  pPag
a930: 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78  er->nExtra = nEx
a940: 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tra;.  pPager->p
a950: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 28 42  BusyHandler = (B
a960: 75 73 79 48 61 6e 64 6c 65 72 20 2a 29 70 42 75  usyHandler *)pBu
a970: 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 6d 65 6d  syHandler;.  mem
a980: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
a990: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
a9a0: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
a9b0: 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
a9c0: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
a9d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a9e0: 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
a9f0: 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
aa00: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
aa10: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
aa20: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
aa30: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
aa40: 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
aa50: 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
aa60: 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
aa70: 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
aa80: 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
aa90: 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
aaa0: 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
aab0: 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
aac0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
aad0: 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
aae0: 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
aaf0: 6c 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  lt sqlite3pager_
ab00: 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65  close().  .** De
ab10: 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e  structors are on
ab20: 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c  ly called by sql
ab30: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
ab40: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
ab50: 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74  e3pager_set_dest
ab60: 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
ab70: 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
ab80: 73 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b  sc)(void*,int)){
ab90: 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  .  pPager->xDest
aba0: 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a  ructor = xDesc;.
abb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
abc0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66   reinitializer f
abd0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
abe0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
abf0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a   reinitializer.*
ac00: 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  * is called when
ac10: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
ac20: 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  a page in cache 
ac30: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
ac40: 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76  ts original.** v
ac50: 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74  alue as a result
ac60: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
ac70: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69   The callback gi
ac80: 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  ves higher-level
ac90: 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f   code.** an oppo
aca0: 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f  rtunity to resto
acb0: 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63  re the EXTRA sec
acc0: 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69  tion to agree wi
acd0: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a  th the restored.
ace0: 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  ** page data..*/
acf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
ad00: 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28  er_set_reiniter(
ad10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
ad20: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76  oid (*xReinit)(v
ad30: 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  oid*,int)){.  pP
ad40: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
ad50: 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a  = xReinit;.}../*
ad60: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
ad70: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
ad80: 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
ad90: 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
ada0: 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
adb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
adc0: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50  ager_pagecount(P
add0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
ade0: 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65   off_t n;.  asse
adf0: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
ae00: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
ae10: 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
ae20: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64  return pPager->d
ae30: 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  bSize;.  }.  if(
ae40: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
ae50: 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ze(&pPager->fd, 
ae60: 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  &n)!=SQLITE_OK )
ae70: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
ae80: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
ae90: 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74  RR_DISK;.    ret
aea0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f  urn 0;.  }.  n /
aeb0: 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  = SQLITE_PAGE_SI
aec0: 5a 45 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ZE;.  if( !pPage
aed0: 72 2d 3e 6d 65 6d 44 62 20 26 26 20 6e 3d 3d 50  r->memDb && n==P
aee0: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 53 51 4c 49  ENDING_BYTE/SQLI
aef0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  TE_PAGE_SIZE ){.
af00: 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69      n++;.  }.  i
af10: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
af20: 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
af30: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
af40: 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  Size = n;.  }.  
af50: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
af60: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
af70: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
af80: 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
af90: 28 50 61 67 65 72 2a 2c 20 63 6f 6e 73 74 20 63  (Pager*, const c
afa0: 68 61 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55  har*);.../*.** U
afb0: 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f  nlink a page fro
afc0: 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
afd0: 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c  (the list of all
afe0: 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
aff0: 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f  f==0).** and fro
b000: 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69  m its hash colli
b010: 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73  sion chain..*/.s
b020: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
b030: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
b040: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
b050: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
b060: 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65  ;..  /* Keep the
b070: 20 70 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f   pFirstSynced po
b080: 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61  inter pointing a
b090: 74 20 74 68 65 20 66 69 72 73 74 20 73 79 6e 63  t the first sync
b0a0: 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f  hronized page */
b0b0: 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67  .  if( pPg==pPag
b0c0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
b0d0: 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
b0e0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
b0f0: 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20  e;.    while( p 
b100: 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
b110: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
b120: 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72  ee; }.    pPager
b130: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
b140: 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   p;.  }..  /* Un
b150: 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72  link from the fr
b160: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20  eelist */.  if( 
b170: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
b180: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  {.    pPg->pPrev
b190: 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
b1a0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
b1b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
b1c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
b1d0: 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  First==pPg );.  
b1e0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
b1f0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
b200: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  e;.  }.  if( pPg
b210: 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
b220: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
b230: 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
b240: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
b250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
b260: 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  rt( pPager->pLas
b270: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
b280: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
b290: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
b2a0: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  }.  pPg->pNextFr
b2b0: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
b2c0: 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55  ree = 0;..  /* U
b2d0: 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70  nlink from the p
b2e0: 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a  gno hash table *
b2f0: 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  /.  if( pPg->pNe
b300: 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50  xtHash ){.    pP
b310: 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
b320: 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  revHash = pPg->p
b330: 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20  PrevHash;.  }.  
b340: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61  if( pPg->pPrevHa
b350: 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  sh ){.    pPg->p
b360: 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
b370: 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
b380: 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
b390: 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65 72     int h = pager
b3a0: 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29  _hash(pPg->pgno)
b3b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
b3c0: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d  ager->aHash[h]==
b3d0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
b3e0: 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
b3f0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
b400: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  }.  pPg->pNextHa
b410: 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
b420: 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ash = 0;.}../*.*
b430: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
b440: 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61  s used to trunca
b450: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
b460: 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74  database.  Delet
b470: 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77  e.** all pages w
b480: 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  hose pgno is lar
b490: 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
b4a0: 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
b4b0: 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20  nreferenced..** 
b4c0: 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
b4d0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
b4e0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
b4f0: 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  zeroed..*/.stati
b500: 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75  c void memoryTru
b510: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
b520: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
b530: 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
b540: 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
b550: 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
b560: 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
b570: 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
b580: 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
b590: 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
b5a0: 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
b5b0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
b5c0: 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
b5d0: 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
b5e0: 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
b5f0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
b600: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
b610: 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
b620: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
b630: 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
b640: 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
b650: 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
b660: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
b670: 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
b680: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
b690: 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
b6a0: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b  pPager->nPage--;
b6b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
b6c0: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
b6d0: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
b6e0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
b6f0: 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
b700: 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
b710: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
b720: 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
b730: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
b740: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
b750: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b760: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
b770: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
b780: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
b790: 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
b7a0: 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
b7b0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
b7c0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
b7d0: 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e  ( nPage>=(unsign
b7e0: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
b7f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
b800: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
b810: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
b820: 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
b830: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
b840: 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e  ;.    memoryTrun
b850: 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
b860: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b870: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OK;.  }.  rc = s
b880: 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
b890: 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  r, 0);.  if( rc!
b8a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b8b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
b8c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
b8d0: 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65  sTruncate(&pPage
b8e0: 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41  r->fd, SQLITE_PA
b8f0: 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6e  GE_SIZE*(off_t)n
b900: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
b910: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b920: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
b930: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20   = nPage;.  }.  
b940: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b950: 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
b960: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
b970: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
b980: 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
b990: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
b9a0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
b9b0: 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
b9c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b9d0: 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
b9e0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
b9f0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
ba00: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
ba10: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
ba20: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
ba30: 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
ba40: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
ba50: 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
ba60: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
ba70: 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
ba80: 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
ba90: 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
baa0: 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
bab0: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
bac0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
bad0: 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a  er_close(Pager *
bae0: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
baf0: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
bb00: 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d   switch( pPager-
bb10: 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  >state ){.    ca
bb20: 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  se PAGER_RESERVE
bb30: 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  D:.    case PAGE
bb40: 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63  R_SYNCED: .    c
bb50: 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ase PAGER_EXCLUS
bb60: 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  IVE: {.      sql
bb70: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
bb80: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
bb90: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
bba0: 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emDb ){.        
bbb0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
bbc0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
bbd0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
bbe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
bbf0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
bc00: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
bc10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
bc20: 73 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a  se PAGER_SHARED:
bc30: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
bc40: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
bc50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
bc60: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
bc70: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
bc80: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
bc90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
bca0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
bcb0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
bcc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bcd0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d  }.  }.  for(pPg=
bce0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
bcf0: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23  g; pPg=pNext){.#
bd00: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
bd10: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
bd20: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48  mDb ){.      PgH
bd30: 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
bd40: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
bd50: 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
bd60: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
bd70: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
bd80: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bd90: 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
bda0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
bdb0: 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
bdc0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
bdd0: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
bde0: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  extAll;.    sqli
bdf0: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  teFree(pPg);.  }
be00: 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
be10: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  e(&pPager->fd);.
be20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
be30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
be40: 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69   );.  /* Temp fi
be50: 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
be60: 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
be70: 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
be80: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
be90: 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
bea0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
beb0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
bec0: 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43 4c    ** }.  */.  CL
bed0: 52 5f 50 41 47 45 52 28 70 50 61 67 65 72 29 3b  R_PAGER(pPager);
bee0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a  .  if( pPager->z
bef0: 46 69 6c 65 6e 61 6d 65 21 3d 28 63 68 61 72 2a  Filename!=(char*
bf00: 29 26 70 50 61 67 65 72 5b 31 5d 20 29 7b 0a 20  )&pPager[1] ){. 
bf10: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20     assert( 0 ); 
bf20: 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65   /* Cannot happe
bf30: 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46  n */.    sqliteF
bf40: 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ree(pPager->zFil
bf50: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  ename);.    sqli
bf60: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
bf70: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
bf80: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
bf90: 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  >zDirectory);.  
bfa0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
bfb0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
bfc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
bfd0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
bfe0: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
bff0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
c000: 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
c010: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
c020: 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61  mber(void *pData
c030: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
c040: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
c050: 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
c060: 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
c070: 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
c080: 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
c090: 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
c0a0: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
c0b0: 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
c0c0: 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
c0d0: 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
c0e0: 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
c0f0: 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
c100: 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
c110: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
c120: 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
c130: 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
c140: 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
c150: 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
c160: 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
c170: 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
c180: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
c190: 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
c1a0: 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
c1b0: 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
c1c0: 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
c1d0: 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
c1e0: 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
c1f0: 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
c200: 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
c210: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
c220: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
c230: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
c240: 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
c250: 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
c260: 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
c270: 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67      if( pPg==pPg
c280: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
c290: 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20  Synced ){.      
c2a0: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
c2b0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
c2c0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
c2d0: 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
c2e0: 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
c2f0: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
c300: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
c310: 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = p;.    }.    i
c320: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
c330: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
c340: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
c350: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
c360: 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tFree;.    }else
c370: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
c380: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
c390: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
c3a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
c3b0: 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
c3c0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
c3d0: 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
c3e0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
c3f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c400: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c   pPg->pPager->pL
c410: 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
c420: 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
c430: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
c440: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
c450: 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46  nRef++;.  REFINF
c460: 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66  O(pPg);.}.#ifdef
c470: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
c480: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
c490: 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
c4a0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
c4b0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
c4c0: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
c4d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c4e0: 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
c4f0: 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
c500: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
c510: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
c520: 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
c530: 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
c540: 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
c550: 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
c560: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
c570: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
c580: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
c590: 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
c5a0: 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
c5b0: 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
c5c0: 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
c5d0: 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69  te3pager_ref(voi
c5e0: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
c5f0: 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
c600: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
c610: 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
c620: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c630: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
c640: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
c650: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
c660: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
c670: 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
c680: 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
c690: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
c6a0: 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
c6b0: 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
c6c0: 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
c6d0: 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
c6e0: 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
c6f0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
c700: 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
c710: 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
c720: 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
c730: 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
c740: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
c750: 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
c760: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
c770: 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
c780: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
c790: 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
c7a0: 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
c7b0: 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
c7c0: 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
c7d0: 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
c7e0: 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
c7f0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
c800: 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
c810: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
c820: 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
c830: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
c840: 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
c850: 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
c860: 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
c870: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
c880: 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
c890: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
c8a0: 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
c8b0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
c8c0: 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
c8d0: 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
c8e0: 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
c8f0: 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
c900: 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
c910: 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
c920: 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
c930: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
c940: 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
c950: 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
c960: 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
c970: 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
c980: 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
c990: 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
c9a0: 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
c9b0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
c9c0: 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
c9d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c9e0: 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
c9f0: 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
ca00: 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
ca10: 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
ca20: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
ca30: 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
ca40: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
ca50: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
ca60: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
ca70: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ca80: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79  ITE_OK;..  /* Sy
ca90: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
caa0: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
cab0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
cac0: 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
cad0: 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
cae0: 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
caf0: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
cb00: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
cb10: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 7a  r->needSync || z
cb20: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 69 66  Master ){.    if
cb30: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
cb40: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
cb50: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
cb60: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
cb70: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
cb80: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
cb90: 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
cba0: 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
cbb0: 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
cbc0: 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
cbd0: 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
cbe0: 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
cbf0: 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
cc00: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
cc10: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
cc20: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
cc30: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
cc40: 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
cc50: 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
cc60: 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
cc70: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
cc80: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
cc90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
cca0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ccb0: 20 20 20 20 6f 66 66 5f 74 20 68 64 72 53 7a 2c      off_t hdrSz,
ccc0: 20 70 67 53 7a 2c 20 6a 53 7a 3b 0a 20 20 20 20   pgSz, jSz;.    
ccd0: 20 20 20 20 68 64 72 53 7a 20 3d 20 4a 4f 55 52      hdrSz = JOUR
cce0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ccf0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 67 53 7a  r);.        pgSz
cd00: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   = JOURNAL_PG_SZ
cd10: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
cd20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cd30: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
cd40: 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20  ->jfd, &jSz);.  
cd50: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
cd60: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
cd70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
cd80: 67 65 72 2d 3e 6e 52 65 63 2a 70 67 53 7a 2b 68  ger->nRec*pgSz+h
cd90: 64 72 53 7a 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20  drSz==jSz );.   
cda0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
cdb0: 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57    {.        /* W
cdc0: 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
cdd0: 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
cde0: 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
cdf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   */.        off_
ce00: 74 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 69  t szJ;.        i
ce10: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
ce20: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
ce30: 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
ce40: 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
ce50: 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
ce60: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
ce70: 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61  lite3OsSync(&pPa
ce80: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
ce90: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
cea0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ceb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
cec0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
ced0: 67 65 72 2d 3e 6a 66 64 2c 20 73 69 7a 65 6f 66  ger->jfd, sizeof
cee0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
cef0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
cf00: 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
cf10: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
cf20: 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
cf30: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
cf40: 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  rc;..        /* 
cf50: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
cf60: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
cf70: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 6f 6e 65  rnal file if one
cf80: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f   is specified */
cf90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4d 61  .        if( zMa
cfa0: 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ster ){.        
cfb0: 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e    assert( strlen
cfc0: 28 7a 4d 61 73 74 65 72 29 3c 70 50 61 67 65 72  (zMaster)<pPager
cfd0: 2d 3e 6e 4d 61 73 74 65 72 20 29 3b 0a 20 20 20  ->nMaster );.   
cfe0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
cff0: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
d000: 72 2d 3e 6a 66 64 2c 20 32 30 29 3b 0a 20 20 20  r->jfd, 20);.   
d010: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
d020: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
d030: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d040: 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
d050: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
d060: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 2b  strlen(zMaster)+
d070: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
d080: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
d090: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
d0a0: 20 20 20 20 20 73 7a 4a 20 3d 20 4a 4f 55 52 4e       szJ = JOURN
d0b0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d0c0: 29 20 2b 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  ) +  pPager->nRe
d0d0: 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  c*JOURNAL_PG_SZ(
d0e0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
d0f0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
d100: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 7a 4a  pPager->jfd, szJ
d110: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d120: 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
d130: 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
d140: 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
d150: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d160: 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  3OsSync(&pPager-
d170: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
d180: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
d190: 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  rc;.      pPager
d1a0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
d1b0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
d1c0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
d1d0: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
d1e0: 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
d1f0: 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
d200: 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
d210: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
d220: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
d230: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
d240: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
d250: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
d260: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
d270: 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
d280: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a  r->pFirst;.  }..
d290: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
d2a0: 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
d2b0: 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
d2c0: 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
d2d0: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
d2e0: 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
d2f0: 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
d300: 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
d310: 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
d320: 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
d330: 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
d340: 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
d350: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
d360: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
d370: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
d380: 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
d390: 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
d3a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d3b0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
d3c0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29  pPager->pFirst )
d3d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
d3e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d3f0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
d400: 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
d410: 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
d420: 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
d430: 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
d440: 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
d450: 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
d460: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
d470: 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
d480: 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
d490: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
d4a0: 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
d4b0: 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
d4c0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
d4d0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
d4e0: 75 73 79 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  usy = 1;..  if( 
d4f0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
d500: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
d510: 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
d520: 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
d530: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
d540: 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
d550: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
d560: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
d570: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d580: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
d590: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
d5a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
d5b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
d5c0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
d5d0: 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f  3OsLock() are no
d5e0: 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  -ops..  **.  ** 
d5f0: 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
d600: 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
d610: 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
d620: 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
d630: 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
d640: 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
d650: 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
d660: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
d670: 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
d680: 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
d690: 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
d6a0: 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
d6b0: 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
d6c0: 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
d6d0: 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
d6e0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
d6f0: 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
d700: 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
d710: 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
d720: 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
d730: 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
d740: 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
d750: 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
d760: 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
d770: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
d780: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
d790: 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
d7a0: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
d7b0: 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
d7c0: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
d7d0: 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
d7e0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
d7f0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
d800: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
d810: 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
d820: 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
d830: 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
d840: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
d850: 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
d860: 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
d870: 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
d880: 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
d890: 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20  back..  */.  do 
d8a0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
d8b0: 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
d8c0: 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
d8d0: 4c 4f 43 4b 29 3b 0a 20 20 7d 77 68 69 6c 65 28  LOCK);.  }while(
d8e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
d8f0: 20 26 26 20 0a 20 20 20 20 20 20 70 50 61 67 65   && .      pPage
d900: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
d910: 26 26 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  && .      pPager
d920: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
d930: 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20  xFunc && .      
d940: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
d950: 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67  dler->xFunc(pPag
d960: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
d970: 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a  ->pArg, busy++).
d980: 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53    );.  if( rc!=S
d990: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d9a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
d9b0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
d9c0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
d9d0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  ;..  while( pLis
d9e0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
d9f0: 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
da00: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
da10: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
da20: 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
da30: 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41  (off_t)SQLITE_PA
da40: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f  GE_SIZE);.    CO
da50: 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
da60: 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
da70: 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36  , pList->pgno, 6
da80: 29 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53  );.    TRACE2("S
da90: 54 4f 52 45 20 70 61 67 65 20 25 64 5c 6e 22 2c  TORE page %d\n",
daa0: 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
dab0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dac0: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
dad0: 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
dae0: 41 28 70 4c 69 73 74 29 2c 20 53 51 4c 49 54 45  A(pList), SQLITE
daf0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
db00: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50   CODEC(pPager, P
db10: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
db20: 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  st), pList->pgno
db30: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
db40: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
db50: 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
db60: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   0;.    pList = 
db70: 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
db80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
db90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dba0: 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
dbb0: 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
dbc0: 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
dbd0: 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
dbe0: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
dbf0: 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
dc00: 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
dc10: 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
dc20: 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
dc30: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
dc40: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
dc50: 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
dc60: 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
dc70: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a  ){.  PgHdr *p, *
dc80: 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d  pList;.  pList =
dc90: 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67   0;.  for(p=pPag
dca0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
dcb0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
dcc0: 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b   if( p->dirty ){
dcd0: 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79  .      p->pDirty
dce0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
dcf0: 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d  pList = p;.    }
dd00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
dd10: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  ist;.}../*.** Ac
dd20: 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
dd30: 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
dd40: 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
dd50: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
dd60: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
dd70: 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
dd80: 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
dd90: 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
dda0: 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
ddb0: 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
ddc0: 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66  * A _get works f
ddd0: 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
dde0: 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
ddf0: 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
de00: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
de10: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
de20: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
de30: 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
de40: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
de50: 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
de60: 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
de70: 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
de80: 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
de90: 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
dea0: 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
deb0: 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
dec0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
ded0: 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
dee0: 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
def0: 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
df00: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
df10: 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
df20: 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
df30: 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
df40: 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
df50: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
df60: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
df70: 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
df80: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
df90: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
dfa0: 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
dfb0: 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
dfc0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
dfd0: 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
dfe0: 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
dff0: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
e000: 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
e010: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
e020: 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
e030: 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
e040: 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
e050: 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
e060: 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
e070: 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
e080: 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
e090: 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
e0a0: 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
e0b0: 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
e0c0: 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
e0d0: 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
e0e0: 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
e0f0: 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
e100: 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
e110: 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
e120: 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
e130: 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
e140: 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
e150: 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
e160: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e170: 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
e180: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
e190: 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
e1a0: 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
e1b0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
e1c0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
e1d0: 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
e1e0: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
e1f0: 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
e200: 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
e210: 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
e220: 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
e230: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
e240: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
e250: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
e260: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
e270: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
e280: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e290: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
e2a0: 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
e2b0: 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44  hen get a SHARED
e2c0: 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68   lock.  ** on th
e2d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
e2e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
e2f0: 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
e300: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
e310: 0a 20 20 20 20 69 6e 74 20 62 75 73 79 20 3d 20  .    int busy = 
e320: 31 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  1;.    do {.    
e330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e340: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
e350: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
e360: 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
e370: 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 0a  SQLITE_BUSY && .
e380: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
e390: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20  pBusyHandler && 
e3a0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
e3b0: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78  >pBusyHandler->x
e3c0: 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20  Func && .       
e3d0: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
e3e0: 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50 61  ndler->xFunc(pPa
e3f0: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
e400: 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b 29  r->pArg, busy++)
e410: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
e420: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e430: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
e440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
e450: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
e460: 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f  R_SHARED;..    /
e470: 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
e480: 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
e490: 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
e4a0: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
e4b0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
e4c0: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
e4d0: 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
e4e0: 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
e4f0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
e500: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
e510: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 0a  >useJournal && .
e520: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
e530: 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67  sFileExists(pPag
e540: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 26 26  er->zJournal) &&
e550: 0a 20 20 20 20 20 20 20 20 21 73 71 6c 69 74 65  .        !sqlite
e560: 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
e570: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
e580: 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
e590: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20   int rc;..      
e5a0: 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
e5b0: 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
e5c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
e5d0: 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73  */.       rc = s
e5e0: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
e5f0: 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
e600: 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
e610: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e620: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
e630: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
e640: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
e650: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
e660: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e670: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
e680: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
e690: 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
e6a0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e6b0: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
e6c0: 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70  E;..       /* Op
e6d0: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
e6e0: 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e  or reading only.
e6f0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
e700: 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a  BUSY if.       *
e710: 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  * we are unable 
e720: 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
e730: 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nal file. .     
e740: 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54    **.       ** T
e750: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e760: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
e770: 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c   be locked itsel
e780: 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a  f.  The.       *
e790: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
e7a0: 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
e7b0: 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
e7c0: 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
e7d0: 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69  .       ** a wri
e7e0: 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72  te lock, so ther
e7f0: 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63  e is never any c
e800: 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20  hance of two or 
e810: 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70  more.       ** p
e820: 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67  rocesses opening
e830: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20   the journal at 
e840: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
e850: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e860: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
e870: 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65  enReadOnly(pPage
e880: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50  r->zJournal, &pP
e890: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
e8a0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e8b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e8c0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
e8d0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  (&pPager->fd, NO
e8e0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
e8f0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
e900: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
e910: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e920: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
e930: 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
e940: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
e950: 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 1;.       pPag
e960: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
e970: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  ed = 0;..       
e980: 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
e990: 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
e9a0: 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
e9b0: 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
e9c0: 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
e9d0: 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
e9e0: 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
e9f0: 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70  */.       rc = p
ea00: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
ea10: 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
ea20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ea30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72  OK ){.         r
ea40: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
ea50: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
ea60: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
ea70: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
ea80: 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a   page in cache *
ea90: 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
eaa0: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
eab0: 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
eac0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26  pPager->memDb &&
ead0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
eae0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
eaf0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
eb00: 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
eb10: 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
eb20: 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
eb30: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
eb40: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
eb50: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
eb60: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a  . */.    int h;.
eb70: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73      pPager->nMis
eb80: 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  s++;.    if( pPa
eb90: 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
eba0: 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61  r->mxPage || pPa
ebb0: 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c  ger->pFirst==0 |
ebc0: 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  | pPager->memDb 
ebd0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ){.      /* Crea
ebe0: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f  te a new page */
ebf0: 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
ec00: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
ec10: 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c  zeof(*pPg) + SQL
ec20: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  ITE_PAGE_SIZE . 
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
ec50: 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
ec60: 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20  ger->nExtra.    
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 20 20 20 20 20 20 2b 20 70 50 61 67            + pPag
ec90: 65 72 2d 3e 6d 65 6d 44 62 2a 73 69 7a 65 6f 66  er->memDb*sizeof
eca0: 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20  (PgHistory) );. 
ecb0: 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
ecc0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
ecd0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
ece0: 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
ecf0: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
ed00: 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ger);.        }.
ed10: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
ed20: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
ed30: 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20  _ERR_MEM;.      
ed40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ed50: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
ed60: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
ed70: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
ed80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
ed90: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
eda0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
edb0: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
edc0: 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65  pPager), 0, size
edd0: 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a  of(PgHistory));.
ede0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
edf0: 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
ee00: 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  er;.      pPg->p
ee10: 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
ee20: 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50  ->pAll;.      pP
ee30: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
ee40: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
ee50: 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nPage++;.    }el
ee60: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  se{.      /* Fin
ee70: 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
ee80: 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
ee90: 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
eea0: 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  does not.      *
eeb0: 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
eec0: 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
eed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
eee0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67      */.      pPg
eef0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
ef00: 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20  tSynced;..      
ef10: 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
ef20: 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
ef30: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
ef40: 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
ef50: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
ef60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
ef70: 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
ef80: 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
ef90: 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65  is a.      ** ve
efa0: 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
efb0: 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
efc0: 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
efd0: 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
efe0: 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74       ** it can't
eff0: 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20   be helped..    
f000: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
f010: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
f020: 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f   int rc = syncJo
f030: 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29  urnal(pPager, 0)
f040: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f050: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
f060: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
f070: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
f080: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f090: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
f0a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f0b0: 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
f0c0: 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  First;.      }. 
f0d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
f0e0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
f0f0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
f100: 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74   page to the dat
f110: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74  abase file if it
f120: 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20 20 20   is dirty..     
f130: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
f140: 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
f150: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
f160: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
f170: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69          pPg->pDi
f180: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rty = 0;.       
f190: 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
f1a0: 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20  e_pagelist( pPg 
f1b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
f1c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f1d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f1e0: 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
f1f0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
f200: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f210: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
f220: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
f230: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
f240: 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ty==0 );..      
f250: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77  /* If the page w
f260: 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20  e are recycling 
f270: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  is marked as alw
f280: 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  aysRollback, the
f290: 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  n.      ** set t
f2a0: 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
f2b0: 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
f2c0: 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
f2d0: 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
f2e0: 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e_dont_rollback(
f2f0: 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  ) optimization f
f300: 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  or the rest of t
f310: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
f320: 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
f330: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
f340: 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
f350: 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
f360: 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  aysRollback.    
f370: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
f380: 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
f390: 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
f3a0: 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
f3b0: 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 20  t remember.     
f3c0: 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
f3d0: 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
f3e0: 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
f3f0: 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
f400: 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  s must.      ** 
f410: 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  be marked as alw
f420: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  aysRollback from
f430: 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20   here on out..  
f440: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
f450: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
f460: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
f470: 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
f480: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
f490: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e    }..      /* Un
f4a0: 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
f4b0: 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
f4c0: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
f4d0: 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f  h table.      */
f4e0: 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
f4f0: 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
f500: 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20  ager->nOvfl++;. 
f510: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67     }.    pPg->pg
f520: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69  no = pgno;.    i
f530: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
f540: 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
f550: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
f560: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
f570: 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
f580: 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
f590: 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
f5a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
f5b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
f5c0: 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
f5d0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
f5e0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
f5f0: 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
f600: 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
f610: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
f620: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
f630: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
f640: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
f650: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
f660: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
f670: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
f680: 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
f690: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
f6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
f6b0: 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d   (pPager->aInStm
f6c0: 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
f6d0: 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
f6e0: 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
f6f0: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
f700: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
f710: 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
f720: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70  from_stmt_list(p
f730: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
f740: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
f750: 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
f760: 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
f770: 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  g);.    pPager->
f780: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20  nRef++;.    h = 
f790: 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
f7a0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
f7b0: 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
f7c0: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
f7d0: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
f7e0: 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
f7f0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
f800: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
f810: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
f820: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
f830: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
f840: 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
f850: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
f860: 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
f870: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
f880: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
f890: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
f8a0: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
f8b0: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
f8c0: 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71 6c  ->dbSize<0 ) sql
f8d0: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
f8e0: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
f8f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
f900: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  Mask!=0 ){.     
f910: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
f920: 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
f930: 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72  A(pPg));.      r
f940: 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
f950: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
f960: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f970: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
f980: 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67  ->dbSize<(int)pg
f990: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  no ){.      mems
f9a0: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
f9b0: 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45  (pPg), 0, SQLITE
f9c0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
f9d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
f9e0: 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  t rc;.      asse
f9f0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
fa00: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
fa10: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
fa20: 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
fa30: 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f  )*(off_t)SQLITE_
fa40: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
fa50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
fa60: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
fa70: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
fa80: 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47  pPg), SQLITE_PAG
fa90: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 54  E_SIZE);.      T
faa0: 52 41 43 45 32 28 22 46 45 54 43 48 20 70 61 67  RACE2("FETCH pag
fab0: 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  e %d\n", pPg->pg
fac0: 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  no);.      CODEC
fad0: 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
fae0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
faf0: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  ->pgno, 3);.    
fb00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fb10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  _OK ){.        o
fb20: 66 66 5f 74 20 66 69 6c 65 53 69 7a 65 3b 0a 20  ff_t fileSize;. 
fb30: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
fb40: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
fb50: 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69  ager->fd,&fileSi
fb60: 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ze)!=SQLITE_OK. 
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
fb80: 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a   fileSize>=pgno*
fb90: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
fba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
fbb0: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
fbc0: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
fbd0: 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pg));.          
fbe0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
fbf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc00: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
fc10: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
fc20: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
fc30: 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ZE);.        }. 
fc40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
fc50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
fc60: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
fc70: 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
fc80: 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ache. */.    pPa
fc90: 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20  ger->nHit++;.   
fca0: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
fcb0: 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
fcc0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
fcd0: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
fce0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
fcf0: 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
fd00: 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
fd10: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
fd20: 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
fd30: 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
fd40: 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
fd50: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
fd60: 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
fd70: 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
fd80: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
fd90: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
fda0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
fdb0: 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
fdc0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
fdd0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
fde0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
fdf0: 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
fe00: 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
fe10: 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
fe20: 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
fe30: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
fe40: 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
fe50: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
fe60: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
fe70: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
fe80: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
fe90: 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
fea0: 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
feb0: 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f   happened..*/.vo
fec0: 69 64 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  id *sqlite3pager
fed0: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
fee0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
fef0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
ff00: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
ff10: 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
ff20: 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
ff30: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
ff40: 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52  ask & ~(PAGER_ER
ff50: 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72  R_FULL) ){.    r
ff60: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
ff70: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ff80: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
ff90: 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20  .  if( pPg==0 ) 
ffa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65  return 0;.  page
ffb0: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
ffc0: 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  urn PGHDR_TO_DAT
ffd0: 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  A(pPg);.}../*.**
ffe0: 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
fff0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
10000 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
10010 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
10020 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
10030 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
10040 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
10050 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
10060 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
10070 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
10080 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
10090 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
100a0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
100b0 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
100c0 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
100d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
100e0 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
100f0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
10100 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
10110 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
10120 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
10130 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41  .  */.  pPg = DA
10140 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
10150 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  a);.  assert( pP
10160 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  g->nRef>0 );.  p
10170 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
10180 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f  FINFO(pPg);..  /
10190 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
101a0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
101b0 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
101c0 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
101d0 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
101e0 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
101f0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
10200 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
10210 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ef==0 ){.    Pag
10220 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
10230 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
10240 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
10250 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20  NextFree = 0;.  
10260 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
10270 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74   = pPager->pLast
10280 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
10290 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  ast = pPg;.    i
102a0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
102b0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
102c0 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
102d0 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Free = pPg;.    
102e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
102f0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
10300 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
10310 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
10320 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69  0 && pPager->pFi
10330 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a  rstSynced==0 ){.
10340 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
10350 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67  irstSynced = pPg
10360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10370 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
10380 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  tor ){.      pPa
10390 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
103a0 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  (pData, pPager->
103b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
103c0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  .  .    /* When 
103d0 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20  all pages reach 
103e0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72  the freelist, dr
103f0 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  op the read lock
10400 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
10410 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
10420 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
10430 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61  r->nRef--;.    a
10440 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
10450 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Ref>=0 );.    if
10460 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
10470 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65  0 && !pPager->me
10480 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 70 61 67  mDb ){.      pag
10490 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
104a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
104b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
104c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
104d0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
104e0 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
104f0 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
10500 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
10510 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
10520 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
10530 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
10540 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10550 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
10560 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
10570 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
10580 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
10590 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
105a0 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
105b0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
105c0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
105d0 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
105e0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
105f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
10600 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  c;.  assert( !pP
10610 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20  ager->memDb );. 
10620 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10630 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
10640 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65  SERVED );.  asse
10650 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
10660 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
10670 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10680 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
10690 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
106a0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
106b0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
106c0 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  rnal = sqliteMal
106d0 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
106e0 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
106f0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
10700 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
10710 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
10720 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  &pPager->fd, SHA
10730 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
10740 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
10750 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
10760 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10770 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
10780 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
10790 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e  clusive(pPager->
107a0 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
107b0 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74  r->jfd,pPager->t
107c0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
107d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
107e0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
107f0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
10800 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
10810 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
10820 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  .    sqlite3OsUn
10830 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
10840 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
10850 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
10860 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
10870 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10880 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
10890 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  }.  sqlite3OsOpe
108a0 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65  nDirectory(pPage
108b0 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 26  r->zDirectory, &
108c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
108d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
108e0 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
108f0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
10900 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
10910 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
10920 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
10930 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
10940 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
10950 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
10960 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
10970 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
10980 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
10990 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
109a0 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
109b0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
109c0 62 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 72 65  bSize;..  /* Cre
109d0 61 74 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ate the header f
109e0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 3a 0a  or the journal:.
109f0 20 20 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20    ** - 8 bytes: 
10a00 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
10a10 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
10a20 2e 0a 20 20 2a 2a 20 2d 20 34 20 62 79 74 65 73  ..  ** - 4 bytes
10a30 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
10a40 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
10a50 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
10a60 64 65 20 69 73 20 6f 6e 2e 0a 20 20 2a 2a 20 2d  de is on..  ** -
10a70 20 34 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   4 bytes: Magic 
10a80 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 63 68  used for page ch
10a90 65 63 6b 73 75 6d 73 2e 0a 20 20 2a 2a 20 2d 20  ecksums..  ** - 
10aa0 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
10ab0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
10ac0 6f 75 6e 74 2e 0a 20 20 2a 2a 20 2d 20 34 20 62  ount..  ** - 4 b
10ad0 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
10ae0 62 79 74 65 73 20 72 65 73 65 72 76 65 64 20 66  bytes reserved f
10af0 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  or master journa
10b00 6c 20 70 74 72 20 28 6e 4d 61 73 74 65 72 29 0a  l ptr (nMaster).
10b10 20 20 2a 2a 20 2d 20 6e 4d 61 73 74 65 72 20 62    ** - nMaster b
10b20 79 74 65 73 3a 20 53 70 61 63 65 20 66 6f 72 20  ytes: Space for 
10b30 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10b40 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
10b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
10b60 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
10b70 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
10b80 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
10b90 6c 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20  lMagic));.  if( 
10ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10bb0 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
10bc0 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
10bd0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  fd, pPager->noSy
10be0 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  nc ? 0xffffffff 
10bf0 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  : 0);.  }.  if( 
10c00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10c10 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64  .    sqlite3Rand
10c20 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
10c30 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
10c40 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
10c50 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  Init);.    rc = 
10c60 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
10c70 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
10c80 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
10c90 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
10ca0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
10cb0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
10cc0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
10cd0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
10ce0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10cf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
10d00 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
10d10 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
10d20 72 2d 3e 6e 4d 61 73 74 65 72 29 3b 0a 20 20 7d  r->nMaster);.  }
10d30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10d40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
10d50 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
10d60 72 2d 3e 6a 66 64 2c 20 32 34 20 2b 20 70 50 61  r->jfd, 24 + pPa
10d70 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20 2d 20 31  ger->nMaster - 1
10d80 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
10d90 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
10da0 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c  er->jfd, "\000",
10db0 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   1);.  }.  if( p
10dc0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
10dd0 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
10de0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
10df0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
10e00 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29  mt_begin(pPager)
10e10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
10e20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10e30 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
10e40 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
10e50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10e60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10e70 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
10e80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10e90 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a  turn rc;  .}../*
10ea0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72  .** Acquire a wr
10eb0 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
10ec0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c  database.  The l
10ed0 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77  ock is removed w
10ee0 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f  hen.** the any o
10ef0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
10f00 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  happen:.**.**   
10f10 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
10f20 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c  commit() is call
10f30 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
10f40 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
10f50 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
10f60 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
10f70 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63  ger_close() is c
10f80 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
10f90 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
10fa0 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
10fb0 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
10fc0 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
10fd0 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
10fe0 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
10ff0 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
11000 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
11010 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
11020 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
11030 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
11040 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
11050 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
11060 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
11070 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
11080 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
11090 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
110a0 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
110b0 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
110c0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
110d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
110e0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
110f0 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
11100 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
11110 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
11120 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
11130 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
11140 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
11150 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
11160 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
11170 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
11180 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
11190 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
111a0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
111b0 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
111c0 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
111d0 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
111e0 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
111f0 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
11200 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
11210 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
11220 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
11230 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
11240 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
11250 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
11260 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
11270 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
11280 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
11290 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
112a0 61 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b  a, int nMaster){
112b0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
112c0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
112d0 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
112e0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
112f0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
11300 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
11310 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
11320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d   );.  assert( nM
11330 61 73 74 65 72 3e 3d 30 20 29 3b 0a 20 20 61 73  aster>=0 );.  as
11340 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11350 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
11360 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
11370 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
11380 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
11390 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
113a0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
113b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
113c0 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 70 50  emDb ){.      pP
113d0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
113e0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
113f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
11400 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
11410 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65  ->dbSize;.    }e
11420 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  lse{.      int b
11430 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 64  usy = 1;.      d
11440 6f 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o {.        rc =
11450 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
11460 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
11470 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
11480 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
11490 4c 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20  LITE_BUSY && .  
114a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
114b0 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20  pBusyHandler && 
114c0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
114d0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
114e0 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20  >xFunc && .     
114f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
11500 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63  syHandler->xFunc
11510 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
11520 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73  ndler->pArg, bus
11530 79 2b 2b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  y++).      );.  
11540 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11550 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11560 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11570 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
11580 2d 3e 6e 4d 61 73 74 65 72 20 3d 20 6e 4d 61 73  ->nMaster = nMas
11590 74 65 72 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ter;.      pPage
115a0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
115b0 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
115c0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
115d0 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  che = 0;.      T
115e0 52 41 43 45 33 28 22 54 52 41 4e 53 41 43 54 49  RACE3("TRANSACTI
115f0 4f 4e 20 25 64 20 6e 4d 61 73 74 65 72 3d 25 64  ON %d nMaster=%d
11600 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
11610 68 2c 20 6e 4d 61 73 74 65 72 29 3b 0a 20 20 20  h, nMaster);.   
11620 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
11630 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
11640 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
11650 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
11660 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
11670 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
11680 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
11690 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
116a0 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
116b0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
116c0 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
116d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
116e0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
116f0 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
11700 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
11710 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
11720 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
11730 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
11740 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
11750 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
11760 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
11770 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
11780 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
11790 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
117a0 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
117b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
117c0 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
117d0 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
117e0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
117f0 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
11800 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
11810 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
11820 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
11830 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
11840 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
11850 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
11860 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
11870 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
11880 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
11890 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
118a0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
118b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
118c0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
118d0 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
118e0 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
118f0 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
11900 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
11910 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
11920 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
11930 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
11940 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
11950 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
11960 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
11970 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
11980 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
11990 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
119a0 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67  () or sqlite3pag
119b0 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f  er_rollback() to
119c0 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e  .** reset..*/.in
119d0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  t sqlite3pager_w
119e0 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61  rite(void *pData
119f0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
11a00 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
11a10 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
11a20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
11a30 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
11a40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
11a50 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
11a60 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
11a70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29  Pager->errMask )
11a80 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  { .    return pa
11a90 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
11aa0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
11ab0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
11ac0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11ad0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
11ae0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
11af0 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
11b00 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
11b10 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
11b20 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
11b30 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
11b40 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
11b50 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  away..  */.  pPg
11b60 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69  ->dirty = 1;.  i
11b70 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
11b80 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d  l && (pPg->inStm
11b90 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  t || pPager->stm
11ba0 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
11bb0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
11bc0 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 72 65  ache = 1;.    re
11bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11be0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
11bf0 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
11c00 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
11c10 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
11c20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  .  ** written to
11c30 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11c40 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
11c50 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
11c60 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  al.  ** or both.
11c70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73 74  .  **.  ** First
11c80 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
11c90 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
11ca0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
11cb0 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61 74  s and.  ** creat
11cc0 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
11cd0 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
11ce0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
11cf0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
11d00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11d10 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61  3pager_begin(pDa
11d20 74 61 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ta, 0);.  if( rc
11d30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11d40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11d50 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
11d60 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
11d70 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69  _RESERVED );.  i
11d80 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
11d90 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
11da0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
11db0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
11dc0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
11dd0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
11de0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
11df0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
11e00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
11e10 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
11e20 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
11e30 6c 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  l );.  pPager->d
11e40 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a  irtyCache = 1;..
11e50 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
11e60 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
11e70 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
11e80 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
11e90 72 20 61 6e 0a 20 20 2a 2a 20 45 58 43 4c 55 53  r an.  ** EXCLUS
11ea0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
11eb0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
11ec0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
11ed0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
11ee0 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
11ef0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
11f00 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
11f10 6c 72 65 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69  lready..  */.  i
11f20 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
11f30 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75  al && (pPager->u
11f40 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61  seJournal || pPa
11f50 67 65 72 2d 3e 6d 65 6d 44 62 29 20 29 7b 0a 20  ger->memDb) ){. 
11f60 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
11f70 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
11f80 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
11f90 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20       int szPg;. 
11fa0 20 20 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a       u32 saved;.
11fb0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
11fc0 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
11fd0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
11fe0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
11ff0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
12000 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32  ;.        TRACE2
12010 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25  ("JOURNAL page %
12020 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  d\n", pPg->pgno)
12030 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
12040 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
12050 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
12060 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69  st->pOrig = sqli
12070 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
12080 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
12090 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
120a0 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
120b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
120c0 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
120d0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
120e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
120f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12100 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
12110 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nal = 1;.      }
12120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 33  else{.        u3
12130 32 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f  2 cksum = pager_
12140 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 50  cksum(pPager, pP
12150 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b  g->pgno, pData);
12160 0a 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d  .        saved =
12170 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f   *(u32*)PGHDR_TO
12180 5f 45 58 54 52 41 28 70 50 67 29 3b 0a 20 20 20  _EXTRA(pPg);.   
12190 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
121a0 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 53 51 4c  (cksum, pPg, SQL
121b0 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
121c0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 53          szPg = S
121d0 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b  QLITE_PAGE_SIZE+
121e0 38 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  8;.        store
121f0 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f  32bits(pPg->pgno
12200 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20  , pPg, -4);.    
12210 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
12220 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
12230 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
12240 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
12250 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
12260 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61 74 61  , &((char*)pData
12270 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20  )[-4], szPg);.  
12280 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f        TRACE3("JO
12290 55 52 4e 41 4c 20 70 61 67 65 20 25 64 20 6e 65  URNAL page %d ne
122a0 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 20 70 50  edSync=%d\n", pP
122b0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
122c0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20  edSync);.       
122d0 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
122e0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
122f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 75   0);.        *(u
12300 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
12310 52 41 28 70 50 67 29 20 3d 20 73 61 76 65 64 3b  RA(pPg) = saved;
12320 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
12330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
12350 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
12360 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
12370 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
12380 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
12390 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  LL;.          re
123a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
123b0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
123c0 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
123d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
123e0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
123f0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
12400 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
12410 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
12420 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
12430 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  .        pPg->ne
12440 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
12450 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
12460 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
12470 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   = 1;.        if
12480 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
12490 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Use ){.         
124a0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
124b0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
124c0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
124d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  );.          pag
124e0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
124f0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  st(pPg);.       
12500 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12510 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12520 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
12530 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
12540 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
12550 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 54 52  noSync;.      TR
12560 41 43 45 33 28 22 41 50 50 45 4e 44 20 70 61 67  ACE3("APPEND pag
12570 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
12580 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
12590 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
125a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
125b0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
125c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
125d0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d  dSync = 1;.    }
125e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
125f0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
12600 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
12610 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
12620 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  in it,.  ** then
12630 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
12640 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
12650 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
12660 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a  .  Note that.  *
12670 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
12680 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
12690 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
126a0 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
126b0 20 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 69 6e 20   format.  ** in 
126c0 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
126d0 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
126e0 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2f  the header..  */
126f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
12700 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  tmtInUse && !pPg
12710 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  ->inStmt && (int
12720 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
12730 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a  er->stmtSize ){.
12740 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
12750 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
12760 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
12770 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
12780 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
12790 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
127a0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
127b0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
127c0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
127d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
127e0 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29  Hist->pStmt==0 )
127f0 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
12800 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
12810 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e  locRaw( pPager->
12820 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
12830 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
12840 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  mt ){.        me
12850 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
12860 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
12870 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
12880 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
12890 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  }.      TRACE2("
128a0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 70 61 67  STMT-JOURNAL pag
128b0 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  e %d\n", pPg->pg
128c0 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  no);.    }else{.
128d0 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74        store32bit
128e0 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  s(pPg->pgno, pPg
128f0 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 43 4f 44  , -4);.      COD
12900 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
12910 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
12920 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12930 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
12940 65 72 2d 3e 73 74 66 64 2c 20 28 28 63 68 61 72  er->stfd, ((char
12950 2a 29 70 44 61 74 61 29 2d 34 2c 20 53 51 4c 49  *)pData)-4, SQLI
12960 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b 34 29 3b  TE_PAGE_SIZE+4);
12970 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53  .      TRACE2("S
12980 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 70 61 67 65  TMT-JOURNAL page
12990 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
129a0 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28  o);.      CODEC(
129b0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
129c0 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  Pg->pgno, 0);.  
129d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
129e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
129f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
12a00 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
12a10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
12a20 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
12a30 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  _ERR_FULL;.     
12a40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12a50 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
12a60 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
12a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12a80 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
12a90 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
12aa0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
12ab0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
12ac0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
12ad0 7d 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74  }.    page_add_t
12ae0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
12af0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
12b00 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
12b10 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
12b20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
12b30 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
12b40 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
12b50 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
12b60 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
12b70 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
12b80 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 64  mDb && pPager->d
12b90 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  bSize==PENDING_B
12ba0 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
12bb0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
12bc0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a  ager->dbSize++;.
12bd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12be0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12bf0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
12c00 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
12c10 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
12c20 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
12c30 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
12c40 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20  3pager_write(). 
12c50 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12c60 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
12c70 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
12c80 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
12c90 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
12ca0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
12cb0 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76  er_iswriteable(v
12cc0 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
12cd0 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
12ce0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
12cf0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  ;.  return pPg->
12d00 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dirty;.}../*.** 
12d10 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
12d20 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
12d30 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
12d40 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
12d50 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
12d60 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
12d70 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74  e3pager_overwrit
12d80 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12d90 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
12da0 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64   *pData){.  void
12db0 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72   *pPage;.  int r
12dc0 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
12dd0 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
12de0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  er, pgno, &pPage
12df0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
12e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
12e10 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
12e20 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
12e30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12e40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
12e50 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61  cpy(pPage, pData
12e60 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
12e70 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ZE);.    }.    s
12e80 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
12e90 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  f(pPage);.  }.  
12ea0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12eb0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
12ec0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
12ed0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
12ee0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
12ef0 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
12f00 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
12f10 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62  on page "pgno" b
12f20 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
12f30 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
12f40 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
12f50 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
12f60 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
12f70 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
12f80 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
12f90 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
12fa0 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
12fb0 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
12fc0 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
12fd0 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
12fe0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
12ff0 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
13000 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
13010 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
13020 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
13030 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
13040 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
13050 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
13060 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
13070 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
13080 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
13090 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
130a0 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
130b0 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
130c0 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
130d0 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
130e0 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
130f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13100 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
13110 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
13120 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
13130 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
13140 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  o sqlite3pager_d
13150 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
13160 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  or the same page
13170 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66  .** will thereaf
13180 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20  ter be ignored. 
13190 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
131a0 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72  ry to avoid a pr
131b0 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61  oblem.** where a
131c0 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20   page with data 
131d0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
131e0 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
131f0 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61  one part of.** a
13200 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
13210 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  n removed from t
13220 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
13230 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a  ng a later part.
13240 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74  ** of the same t
13250 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
13260 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f  eused for some o
13270 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57  ther purpose.  W
13280 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72  hen it.** is fir
13290 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  st added to the 
132a0 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72  freelist, this r
132b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
132c0 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a  .  When reused,.
132d0 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  ** the dont_roll
132e0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69  back() routine i
132f0 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62  s called.  But b
13300 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
13310 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74  contains.** crit
13320 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74  ical data, we st
13330 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
13340 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c  ure it gets roll
13350 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
13360 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f  .** of the dont_
13370 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  rollback() call.
13380 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13390 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65  pager_dont_write
133a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
133b0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
133c0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
133d0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
133e0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20   return;..  pPg 
133f0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
13400 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
13410 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
13420 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
13430 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79  Pg && pPg->dirty
13440 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
13450 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
13460 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
13470 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
13480 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
13490 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
134a0 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
134b0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
134c0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
134d0 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
134e0 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
134f0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
13500 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
13510 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
13520 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
13530 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
13540 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
13550 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
13560 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
13570 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
13580 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
13590 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
135a0 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
135b0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
135c0 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
135d0 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
135e0 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
135f0 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
13600 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
13610 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
13620 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
13630 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
13640 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
13650 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
13660 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
13670 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
13680 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
13690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52   }else{.      TR
136a0 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
136b0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
136c0 22 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d  ", pgno, pPager-
136d0 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 70 50  >fd.h);.      pP
136e0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
136f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
13700 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
13710 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
13720 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
13730 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
13740 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
13750 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
13760 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
13770 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
13780 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
13790 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
137a0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
137b0 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
137c0 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
137d0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
137e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
137f0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
13800 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
13810 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
13820 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
13830 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
13840 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
13850 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50  Pager;..  if( pP
13860 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
13870 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20  ER_EXCLUSIVE || 
13880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13890 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
138a0 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
138b0 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
138c0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
138d0 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  back || pPager->
138e0 6d 65 6d 44 62 20 29 20 72 65 74 75 72 6e 3b 0a  memDb ) return;.
138f0 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
13900 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
13910 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
13920 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
13930 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
13940 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
13950 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
13960 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
13970 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
13980 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
13990 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
139a0 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  l = 1;.    if( p
139b0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
139c0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
139d0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
139e0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
139f0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
13a00 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
13a10 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
13a20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22    }.    TRACE3("
13a30 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
13a40 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
13a50 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65  pPg->pgno, pPage
13a60 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 7d 0a 20 20  r->fd.h);.  }.  
13a70 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
13a80 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
13a90 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
13aa0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
13ab0 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
13ac0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
13ad0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
13ae0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
13af0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
13b00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13b10 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
13b20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
13b30 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
13b40 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
13b50 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
13b60 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
13b70 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
13b80 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67  /*.** Clear a Pg
13b90 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f  History block.*/
13ba0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
13bb0 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74  arHistory(PgHist
13bc0 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73  ory *pHist){.  s
13bd0 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
13be0 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74  >pOrig);.  sqlit
13bf0 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
13c00 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f  mt);.  pHist->pO
13c10 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74  rig = 0;.  pHist
13c20 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a  ->pStmt = 0;.}..
13c30 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
13c40 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
13c50 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
13c60 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
13c70 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
13c80 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
13c90 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
13ca0 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
13cb0 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
13cc0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
13cd0 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
13ce0 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
13cf0 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
13d00 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
13d10 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
13d20 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  _commit(Pager *p
13d30 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
13d40 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
13d50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
13d60 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52  rrMask==PAGER_ER
13d70 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  R_FULL ){.    rc
13d80 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
13d90 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
13da0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13db0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13dc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
13dd0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
13de0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
13df0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
13e00 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
13e10 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
13e20 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
13e30 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
13e40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
13e50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
13e60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13e70 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
13e80 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
13e90 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
13ea0 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  .h);.  if( pPage
13eb0 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
13ec0 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
13ed0 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
13ee0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69  pPager);.    whi
13ef0 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  le( pPg ){.     
13f00 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47   clearHistory(PG
13f10 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
13f20 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20   pPager));.     
13f30 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
13f40 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
13f50 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
13f60 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
13f70 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
13f80 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  evStmt = pPg->pN
13f90 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
13fa0 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44     pPg = pPg->pD
13fb0 69 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  irty;.    }.#ifn
13fc0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66  def NDEBUG.    f
13fd0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
13fe0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
13ff0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
14000 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
14010 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
14020 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
14030 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14040 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
14050 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
14060 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
14070 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
14080 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
14090 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
140a0 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  dif.    pPager->
140b0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
140c0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
140d0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
140e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
140f0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  K;.  }.  if( pPa
14100 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d  ger->dirtyCache=
14110 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69  =0 ){.    /* Exi
14120 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74  t early (without
14130 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d   doing the time-
14140 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65  consuming sqlite
14150 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29  3OsSync() calls)
14160 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65  .    ** if there
14170 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68   have been no ch
14180 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
14190 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
141a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
141b0 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  r->needSync==0 )
141c0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
141d0 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
141e0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
141f0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
14200 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14210 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
14220 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
14230 29 3b 0a 23 69 66 20 30 0a 20 20 72 63 20 3d 20  );.#if 0.  rc = 
14240 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
14250 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  er, 0);.  if( rc
14260 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14270 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61     goto commit_a
14280 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 70 50 67 20  bort;.  }.  pPg 
14290 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
142a0 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
142b0 65 72 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  er);.  if( pPg )
142c0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
142d0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
142e0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
142f0 20 7c 7c 20 28 21 70 50 61 67 65 72 2d 3e 6e 6f   || (!pPager->no
14300 53 79 6e 63 20 26 26 20 73 71 6c 69 74 65 33 4f  Sync && sqlite3O
14310 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66  sSync(&pPager->f
14320 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  d)!=SQLITE_OK) )
14330 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d  {.      goto com
14340 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 20 20 7d  mit_abort;.    }
14350 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63  .  }.#endif.  rc
14360 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
14370 73 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b  sync(pPager, 0);
14380 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
143a0 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
143b0 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f   }.  rc = pager_
143c0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
143d0 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  er);.  pPager->d
143e0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65  bSize = -1;.  re
143f0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a  turn rc;..  /* J
14400 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79 74  ump here if anyt
14410 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
14420 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
14430 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  t process..  */.
14440 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20  commit_abort:.  
14450 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
14460 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
14470 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
14480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14490 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
144a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
144b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
144c0 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
144d0 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
144e0 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
144f0 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
14500 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
14510 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
14520 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
14530 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
14540 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
14550 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
14560 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14570 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
14580 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
14590 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
145a0 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
145b0 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
145c0 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54   protocol (SQLIT
145d0 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75  E_PROTOCOL) or u
145e0 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
145f0 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
14600 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
14610 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
14620 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
14630 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
14640 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
14650 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
14660 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
14670 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
14680 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
14690 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
146a0 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
146b0 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
146c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
146d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
146e0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  ager_rollback(Pa
146f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14700 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32  int rc;.  TRACE2
14710 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
14720 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
14730 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d  .  if( pPager->m
14740 65 6d 44 62 20 29 7b 0a 20 20 20 20 50 67 48 64  emDb ){.    PgHd
14750 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
14760 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
14770 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
14780 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
14790 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61   *pHist;.      a
147a0 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79  ssert( !p->alway
147b0 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
147c0 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79     if( !p->dirty
147d0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
147e0 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
147f0 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
14800 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f  (p, pPager))->pO
14810 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rig );.        a
14820 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
14830 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
14840 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
14850 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  >pStmt );.      
14860 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
14870 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74    }..      pHist
14880 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
14890 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  (p, pPager);.   
148a0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
148b0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  rig ){.        m
148c0 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
148d0 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70  ATA(p), pHist->p
148e0 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  Orig, pPager->pa
148f0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
14900 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43   TRACE2("ROLLBAC
14910 4b 2d 50 41 47 45 20 25 64 5c 6e 22 2c 20 70 2d  K-PAGE %d\n", p-
14920 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65  >pgno);.      }e
14930 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41  lse{.        TRA
14940 43 45 32 28 22 50 41 47 45 20 25 64 20 69 73 20  CE2("PAGE %d is 
14950 63 6c 65 61 6e 5c 6e 22 2c 20 70 2d 3e 70 67 6e  clean\n", p->pgn
14960 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
14970 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70    clearHistory(p
14980 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Hist);.      p->
14990 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
149a0 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20   p->inJournal = 
149b0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74  0;.      p->inSt
149c0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  mt = 0;.      p-
149d0 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e  >pPrevStmt = p->
149e0 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a  pNextStmt = 0;..
149f0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
14a00 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
14a10 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
14a20 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54  Reiniter(PGHDR_T
14a30 4f 5f 44 41 54 41 28 70 29 2c 20 70 50 61 67 65  O_DATA(p), pPage
14a40 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14a50 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
14a60 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
14a70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
14a80 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
14a90 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
14aa0 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
14ab0 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
14ac0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
14ad0 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
14ae0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
14af0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
14b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14b10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
14b20 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
14b30 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
14b40 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
14b50 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
14b60 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
14b70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
14b80 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ze = -1;.    ret
14b90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
14ba0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
14bb0 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d  sk!=0 && pPager-
14bc0 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f  >errMask!=PAGER_
14bd0 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
14be0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
14bf0 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
14c00 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  VE ){.      page
14c10 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
14c20 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 1);.    }.   
14c30 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
14c40 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
14c50 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
14c60 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
14c70 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e  SERVED ){.    in
14c80 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20  t rc2;.    rc = 
14c90 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
14ca0 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
14cb0 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72  rc2 = pager_unwr
14cc0 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
14cd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14cf0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
14d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
14d10 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
14d20 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 7d  (pPager, 1);.  }
14d30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14d40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
14d50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
14d60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
14d70 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
14d80 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20  R_CORRUPT;.  }. 
14d90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
14da0 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72  = -1;.  return r
14db0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
14dc0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64  rn TRUE if the d
14dd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
14de0 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
14df0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
14e00 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
14e10 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79  se is (in theory
14e20 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ) writable..*/.i
14e30 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
14e40 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  isreadonly(Pager
14e50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
14e60 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
14e70 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Only;.}../*.** T
14e80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
14e90 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
14ea0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
14eb0 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
14ec0 65 33 70 61 67 65 72 5f 73 74 61 74 73 28 50 61  e3pager_stats(Pa
14ed0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14ee0 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b  static int a[9];
14ef0 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
14f00 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
14f10 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
14f20 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
14f30 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
14f40 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
14f50 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
14f60 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
14f70 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61   = pPager->errMa
14f80 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  sk;.  a[6] = pPa
14f90 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
14fa0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
14fb0 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67  s;.  a[8] = pPag
14fc0 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74  er->nOvfl;.  ret
14fd0 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn a;.}../*.** 
14fe0 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  Set the statemen
14ff0 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74  t rollback point
15000 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
15010 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63  tine should be c
15020 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  alled with the t
15030 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
15040 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70  al already.** op
15050 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65  en.  A new state
15060 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
15070 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e  created that can
15080 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c   be used to roll
15090 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20  back.** changes 
150a0 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  of a single SQL 
150b0 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61  command within a
150c0 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74   larger transact
150d0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
150e0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  te3pager_stmt_be
150f0 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
15100 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
15110 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54  char zTemp[SQLIT
15120 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
15130 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
15140 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
15150 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d 54  ;.  TRACE2("STMT
15160 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 70 50  -BEGIN %d\n", pP
15170 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69  ager->fd.h);.  i
15180 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
15190 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
151a0 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
151b0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
151c0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
151d0 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
151e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
151f0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
15200 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
15210 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
15220 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
15230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15240 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15250 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15260 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  pen );.  pPager-
15270 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74  >aInStmt = sqlit
15280 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
15290 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
152a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
152b0 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
152c0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
152d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
152e0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65  ED_LOCK);.    re
152f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15300 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  M;.  }.#ifndef N
15310 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c  DEBUG.  rc = sql
15320 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
15330 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
15340 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
15350 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
15360 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
15370 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  led;.  assert( p
15380 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
15390 20 3d 3d 20 0a 20 20 20 20 70 50 61 67 65 72 2d   == .    pPager-
153a0 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47  >nRec*JOURNAL_PG
153b0 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
153c0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
153d0 67 65 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ger) );.#endif. 
153e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
153f0 7a 65 20 3d 0a 20 20 20 20 20 70 50 61 67 65 72  ze =.     pPager
15400 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50  ->nRec*JOURNAL_P
15410 47 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  G_SZ(pPager) + J
15420 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
15430 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
15440 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
15450 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66  er->dbSize;.  if
15460 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
15470 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
15480 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
15490 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50  ntemp(zTemp, &pP
154a0 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
154b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
154c0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
154d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
154e0 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  mtOpen = 1;.    
154f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
15500 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
15510 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
15520 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
15530 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65  TE_OK;. .stmt_be
15540 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  gin_failed:.  if
15550 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
15560 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  t ){.    sqliteF
15570 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  ree(pPager->aInS
15580 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
15590 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
155a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
155b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
155c0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
155d0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
155e0 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67  _stmt_commit(Pag
155f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
15600 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
15610 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
15620 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
15630 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
15640 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70  -COMMIT %d\n", p
15650 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
15660 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
15670 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71  emDb ){.      sq
15680 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
15690 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
156a0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
156b0 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65  sTruncate(&pPage
156c0 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a  r->stfd, 0); */.
156d0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
156e0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
156f0 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  t );.      pPage
15700 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
15710 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50      }.    for(pP
15720 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
15730 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
15740 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
15750 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
15760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
15770 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  g->inStmt );.   
15780 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
15790 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
157a0 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
157b0 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
157c0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
157d0 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
157e0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
157f0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
15800 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
15810 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
15820 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
15830 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
15840 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
15850 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
15860 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
15870 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
15880 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
15890 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
158a0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
158b0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
158c0 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
158d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
158e0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
158f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
15900 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
15910 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  mt_rollback(Page
15920 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
15930 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
15940 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
15950 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d  .    TRACE2("STM
15960 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
15970 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
15980 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
15990 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
159a0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
159b0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
159c0 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
159d0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  g=pPg->pNextStmt
159e0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
159f0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
15a00 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
15a10 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
15a20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
15a30 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
15a40 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
15a50 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74  DATA(pPg), pHist
15a60 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d  ->pStmt, pPager-
15a70 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
15a80 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
15a90 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
15aa0 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
15ab0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
15ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15ad0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
15ae0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
15af0 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d  tSize;.      mem
15b00 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
15b10 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
15b20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
15b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
15b40 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
15b50 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
15b60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70    }.    sqlite3p
15b70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
15b80 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
15b90 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
15ba0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
15bb0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
15bc0 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
15bd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
15be0 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
15bf0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
15c00 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
15c10 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
15c20 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65  e3pager_filename
15c30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15c40 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15c50 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ->zFilename;.}..
15c60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
15c70 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
15c80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15c90 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
15ca0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72  sqlite3pager_dir
15cb0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
15cc0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
15cd0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
15ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15cf0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
15d00 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
15d10 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
15d20 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
15d30 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65  ager_journalname
15d40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15d50 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15d60 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
15d70 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
15d80 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
15d90 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
15da0 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63  3pager_set_codec
15db0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
15dc0 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  r,.  void (*xCod
15dd0 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
15de0 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
15df0 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
15e00 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
15e10 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
15e20 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
15e30 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f   pCodecArg;.}../
15e40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15e50 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
15e60 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
15e70 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
15e80 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
15e90 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
15ea0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
15eb0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15ec0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
15ed0 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
15ee0 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64  *pPager){.  void
15ef0 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72   *pPage;.  PgHdr
15f00 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20   *pPgHdr;.  u32 
15f10 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
15f20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
15f30 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
15f40 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
15f50 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ing. */.  rc = s
15f60 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
15f70 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67  pPager, 1, &pPag
15f80 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
15f90 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15fa0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
15fb0 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
15fc0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
15fd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
15fe0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65  urn rc;..  /* Re
15ff0 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ad the current v
16000 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e  alue at byte 24.
16010 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44   */.  pPgHdr = D
16020 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61  ATA_TO_PGHDR(pPa
16030 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f  ge);.  change_co
16040 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65  unter = retrieve
16050 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32  32bits(pPgHdr, 2
16060 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  4);..  /* Increm
16070 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
16080 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
16090 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
160a0 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
160b0 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73  e_counter++;.  s
160c0 74 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e 67  tore32bits(chang
160d0 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48 64  e_counter, pPgHd
160e0 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65  r, 24);..  /* Re
160f0 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
16100 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73  eference. */.  s
16110 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
16120 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  f(pPage);.  retu
16130 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16140 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
16150 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
16160 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
16170 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
16180 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
16190 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
161a0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
161b0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
161c0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
161d0 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
161e0 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
161f0 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
16200 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
16210 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
16220 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
16230 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
16240 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
16250 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
16260 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
16270 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
16280 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
16290 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
162a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
162b0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
162c0 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
162d0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
162e0 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
162f0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
16300 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
16310 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
16320 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
16330 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
16340 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
16350 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
16360 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
16370 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
16380 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
16390 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
163a0 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
163b0 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63  e3pager_sync() c
163c0 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  all..*/.int sqli
163d0 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61  te3pager_sync(Pa
163e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
163f0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
16400 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16410 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
16420 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
16430 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
16440 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
16450 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
16460 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
16470 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
16480 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
16490 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
164a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
164b0 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
164c0 44 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65  D && !pPager->me
164d0 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 64  mDb && pPager->d
164e0 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
164f0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
16500 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16510 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
16520 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
16530 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
16540 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
16550 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16560 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
16570 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63  it;..    /* Sync
16580 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
16590 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 79  e */.    rc = sy
165a0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
165b0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
165c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
165d0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
165e0 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  it;..    /* Writ
165f0 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
16600 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
16610 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50  e file */.    pP
16620 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
16630 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
16640 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  ager);.    rc = 
16650 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
16660 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
16670 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16680 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
16690 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  t;..    /* Sync 
166a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
166b0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
166c0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
166d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
166e0 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
166f0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  r->fd);.    }.. 
16700 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
16710 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
16720 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a  .  }..sync_exit:
16730 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16740 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
16750 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
16760 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
16770 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
16780 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
16790 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f  e of the file lo
167a0 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ck for the given
167b0 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72   pager..** The r
167c0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f  eturn value is o
167d0 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53  ne of NO_LOCK, S
167e0 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
167f0 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45  RVED_LOCK,.** PE
16800 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45  NDING_LOCK, or E
16810 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
16820 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
16830 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67  er_lockstate(Pag
16840 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66  er *pPager){.#if
16850 64 65 66 20 4f 53 5f 54 45 53 54 0a 20 20 72 65  def OS_TEST.  re
16860 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e  turn pPager->fd.
16870 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6c  fd.locktype;.#el
16880 73 65 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  se.  return pPag
16890 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b  er->fd.locktype;
168a0 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66  .#endif.}.#endif
168b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
168c0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  TEST./*.** Print
168d0 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
168e0 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
168f0 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
16900 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
16910 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
16920 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67  dump(Pager *pPag
16930 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
16940 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  g;.  for(pPg=pPa
16950 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
16960 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
16970 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  l){.    if( pPg-
16980 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69  >nRef<=0 ) conti
16990 6e 75 65 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  nue;.    printf(
169a0 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 30  "PAGE %3d addr=0
169b0 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22  x%08x nRef=%d\n"
169c0 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
169d0 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f  gno, (int)PGHDR_
169e0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
169f0 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a  g->nRef);.  }.}.
16a00 23 65 6e 64 69 66 0a                             #endif.