/ Hex Artifact Content
Login

Artifact 453099416c10669365ca70f12f13e67e6ef11000:


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: 31 20 32 30 30 34 2f 30 36 2f 31 36 20 31 32 3a  1 2004/06/16 12:
0360: 30 31 3a 30 31 20 64 61 6e 69 65 6c 6b 31 39 37  01:01 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 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
5e10: 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
5e20: 65 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  e(zMaster, &mast
5e30: 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  er, 0);.  if( rc
5e40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
5e50: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
5e60: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
5e70: 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 1;.  rc = sqli
5e80: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d  te3OsFileSize(&m
5e90: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
5ea0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
5eb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
5ec0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
5ed0: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
5ee0: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
5ef0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
5f00: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
5f10: 74 65 72 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  terPtr;.    int 
5f20: 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20 2f 2a  nMasterPtr;   /*
5f30: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
5f40: 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 7a 4d   allocated at zM
5f50: 61 73 74 65 72 50 74 72 20 2a 2f 0a 0a 20 20 20  asterPtr */..   
5f60: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
5f70: 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
5f80: 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
5f90: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
5fa0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61  .    ** sqliteMa
5fb0: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
5fc0: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
5fd0: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a  Journal. .    **
5fe0: 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 61 6c 6c  .    ** Also all
5ff0: 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 28  ocate an extra (
6000: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 2b  strlen(zMaster)+
6010: 31 29 20 62 79 74 65 73 2e 20 54 68 69 73 20 73  1) bytes. This s
6020: 70 61 63 65 20 69 73 20 75 73 65 64 0a 20 20 20  pace is used.   
6030: 20 2a 2a 20 74 6f 20 6c 6f 61 64 20 61 20 6d 61   ** to load a ma
6040: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
6050: 65 6e 61 6d 65 20 66 72 6f 6d 20 73 6f 6d 65 20  ename from some 
6060: 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  other journal fi
6070: 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 63 68 65  le to.    ** che
6080: 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
6090: 61 74 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  at this master j
60a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
60b0: 20 2a 2f 0a 20 20 20 20 6e 4d 61 73 74 65 72 50   */.    nMasterP
60c0: 74 72 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73  tr = strlen(zMas
60d0: 74 65 72 29 20 2b 20 31 3b 0a 20 20 20 20 7a 4d  ter) + 1;.    zM
60e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28  asterJournal = (
60f0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
6100: 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
6110: 61 6c 29 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  al) + nMasterPtr
6120: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
6130: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
6140: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6150: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
6160: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
6170: 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
6180: 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
6190: 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
61a0: 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d  urnal];.    rc =
61b0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26   sqlite3OsRead(&
61c0: 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  master, zMasterJ
61d0: 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a  ournal, nMasterJ
61e0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
61f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6200: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
6210: 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  out;..    zJourn
6220: 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
6230: 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
6240: 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
6250: 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
6260: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
6270: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
6280: 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e  ileExists(zJourn
6290: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  al) ){.        /
62a0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
62b0: 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
62c0: 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
62d0: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
62e0: 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
62f0: 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
6300: 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
6310: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
6320: 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
6330: 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
6340: 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
6350: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
6360: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
6370: 20 20 20 20 20 20 4f 73 46 69 6c 65 20 6a 6f 75        OsFile jou
6380: 72 6e 61 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  rnal;.        in
6390: 74 20 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20  t nMaster;.     
63a0: 20 20 20 6f 66 66 5f 74 20 6a 73 7a 3b 0a 0a 20     off_t jsz;.. 
63b0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
63c0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
63d0: 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75  y(zJournal, &jou
63e0: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
63f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6410: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f  lite3OsClose(&jo
6420: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
6430: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
6440: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
6450: 0a 09 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68  ../* Check if th
6460: 65 20 66 69 6c 65 20 69 73 20 62 69 67 20 65 6e  e file is big en
6470: 6f 75 67 68 20 74 6f 20 62 65 20 61 20 6a 6f 75  ough to be a jou
6480: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
6490: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 72 65    ** with the re
64a0: 71 75 69 72 65 64 20 6d 61 73 74 65 72 20 6a 6f  quired master jo
64b0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 49 66 20 6e  urnal name. If n
64c0: 6f 74 2c 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  ot, ignore it.. 
64d0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
64e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
64f0: 46 69 6c 65 53 69 7a 65 28 26 6a 6f 75 72 6e 61  FileSize(&journa
6500: 6c 2c 20 26 6a 73 7a 29 3b 0a 20 20 20 20 20 20  l, &jsz);.      
6510: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6520: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
6530: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
6540: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
6550: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
6560: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
6570: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
6580: 73 7a 3c 28 32 35 2b 73 74 72 6c 65 6e 28 7a 4d  sz<(25+strlen(zM
6590: 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20  aster)) ){.     
65a0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
65b0: 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(&journal);. 
65c0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
65d0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
65e0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a       .        /*
65f0: 20 53 65 65 6b 20 74 6f 20 74 68 65 20 70 6f 69   Seek to the poi
6600: 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nt in the journa
6610: 6c 20 77 68 65 72 65 20 74 68 65 20 6d 61 73 74  l where the mast
6620: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
6630: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74          ** is st
6640: 6f 72 65 64 2e 20 52 65 61 64 20 74 68 65 20 6d  ored. Read the m
6650: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6660: 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  me into memory o
6670: 62 74 61 69 6e 65 64 0a 20 20 20 20 20 20 20 20  btained.        
6680: 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ** from malloc..
6690: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
66a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
66b0: 73 53 65 65 6b 28 26 6a 6f 75 72 6e 61 6c 2c 20  sSeek(&journal, 
66c0: 32 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  20);.        if(
66d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
66e0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
66f0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  out;.        rc 
6700: 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 6a 6f  = read32bits(&jo
6710: 75 72 6e 61 6c 2c 20 28 75 33 32 2a 29 26 6e 4d  urnal, (u32*)&nM
6720: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
6730: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6740: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
6750: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
6760: 69 66 28 20 6e 4d 61 73 74 65 72 3e 3d 6e 4d 61  if( nMaster>=nMa
6770: 73 74 65 72 50 74 72 20 29 7b 0a 20 20 20 20 20  sterPtr ){.     
6780: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6790: 33 4f 73 52 65 61 64 28 26 6a 6f 75 72 6e 61 6c  3OsRead(&journal
67a0: 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
67b0: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
67c0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
67d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
67e0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
67f0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
6800: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6810: 69 66 28 20 7a 4d 61 73 74 65 72 50 74 72 5b 6e  if( zMasterPtr[n
6820: 4d 61 73 74 65 72 50 74 72 2d 31 5d 3d 3d 27 5c  MasterPtr-1]=='\
6830: 30 27 20 26 26 20 21 73 74 72 63 6d 70 28 7a 4d  0' && !strcmp(zM
6840: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
6850: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
6860: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
6870: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
6880: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
6890: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
68b0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
68c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
68d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
68e0: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
68f0: 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c  (strlen(zJournal
6900: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
6910: 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65    .  sqlite3OsDe
6920: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a  lete(zMaster);..
6930: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
6940: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
6950: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
6960: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  eFree(zMasterJou
6970: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
6980: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
6990: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
69a0: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
69b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
69c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76  }../*.** Make ev
69d0: 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
69e0: 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68  cache agree with
69f0: 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
6a00: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
6a10: 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65  s,.** reread the
6a20: 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74   disk to reset t
6a30: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
6a40: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
6a50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
6a60: 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  led after a roll
6a70: 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f  back in which so
6a80: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20  me of the dirty 
6a90: 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68  cache.** pages h
6aa0: 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ad never been wr
6ab0: 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73  itten out to dis
6ac0: 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  k.  We need to r
6ad0: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  oll back the.** 
6ae0: 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  cache content an
6af0: 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61  d the easiest wa
6b00: 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20  y to do that is 
6b10: 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c  to reread the ol
6b20: 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63  d content.** bac
6b30: 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e  k from the disk.
6b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6b50: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
6b60: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
6b70: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
6b80: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6b90: 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d  E_OK;.  for(pPg=
6ba0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
6bb0: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
6bc0: 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20  tAll){.    char 
6bd0: 7a 42 75 66 5b 53 51 4c 49 54 45 5f 50 41 47 45  zBuf[SQLITE_PAGE
6be0: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20  _SIZE];.    if( 
6bf0: 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f  !pPg->dirty ) co
6c00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
6c10: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
6c20: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
6c30: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
6c40: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
6c50: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
6c60: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
6c70: 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b  )(pPg->pgno-1));
6c80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6c90: 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
6ca0: 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 53 51 4c  r->fd, zBuf, SQL
6cb0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
6cc0: 20 20 20 20 20 20 54 52 41 43 45 32 28 22 52 45        TRACE2("RE
6cd0: 46 45 54 43 48 20 70 61 67 65 20 25 64 5c 6e 22  FETCH page %d\n"
6ce0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
6cf0: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
6d00: 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e  , zBuf, pPg->pgn
6d10: 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 2);.      if(
6d20: 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
6d30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
6d40: 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 53 51  mset(zBuf, 0, SQ
6d50: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
6d60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6d70: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d  Pg->nRef==0 || m
6d80: 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44  emcmp(zBuf, PGHD
6d90: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
6da0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
6db0: 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) ){.      memcp
6dc0: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
6dd0: 70 50 67 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49  pPg), zBuf, SQLI
6de0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
6df0: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
6e00: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
6e10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
6e20: 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f  einiter(PGHDR_TO
6e30: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
6e40: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
6e50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6e60: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
6e70: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20  _TO_EXTRA(pPg), 
6e80: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
6e90: 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
6ea0: 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  }.    pPg->needS
6eb0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ync = 0;.    pPg
6ec0: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d  ->dirty = 0;.  }
6ed0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6ee0: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
6ef0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
6f00: 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
6f10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6f20: 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
6f30: 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
6f40: 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
6f50: 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
6f60: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
6f70: 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
6f80: 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
6f90: 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
6fa0: 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
6fb0: 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
6fc0: 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
6fd0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
6fe0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
6ff0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
7000: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
7010: 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
7020: 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
7030: 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
7040: 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
7050: 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
7060: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
7070: 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
7080: 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
7090: 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
70a0: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
70b0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
70c0: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
70d0: 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
70e0: 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
70f0: 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
7100: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
7110: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
7120: 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
7130: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
7140: 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
7150: 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
7160: 20 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74   (5)  4 byte int
7170: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
7180: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
7190: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  s in the master 
71a0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
71b0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75   name.  The valu
71c0: 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69  e may be zero (i
71d0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
71e0: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a  re is no master.
71f0: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
7200: 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79  .).**  (6)  N by
7210: 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  tes of the maste
7220: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
7230: 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62   The name will b
7240: 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  e nul-terminated
7250: 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69  .**       and mi
7260: 67 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74  ght be shorter t
7270: 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  han the value re
7280: 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66  ad from (5).  If
7290: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
72a0: 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20  **       of the 
72b0: 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65  name is \000 the
72c0: 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  n there is no ma
72d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ster journal.  T
72e0: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  he master.**    
72f0: 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20     journal name 
7300: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46  is stored in UTF
7310: 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72  -8..**  (7)  Zer
7320: 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
7330: 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
7340: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
7350: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
7360: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
7370: 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
7380: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
7390: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
73a0: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
73b0: 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
73c0: 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
73d0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
73e0: 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
73f0: 72 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76  rst 6 items abov
7400: 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
7410: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
7420: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
7430: 66 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a  f the 7th item..
7440: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
7450: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
7460: 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
7470: 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
7480: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
7490: 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
74a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
74b0: 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
74c0: 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
74d0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
74e0: 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
74f0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
7500: 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
7510: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
7520: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
7530: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
7540: 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
7550: 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
7560: 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
7570: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
7580: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
7590: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
75a0: 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
75b0: 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
75c0: 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
75d0: 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
75e0: 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
75f0: 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
7600: 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
7610: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
7620: 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
7630: 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
7640: 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
7650: 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
7660: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
7670: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
7680: 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
7690: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
76a0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
76b0: 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
76c0: 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
76d0: 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
76e0: 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
76f0: 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
7700: 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
7710: 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
7720: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
7730: 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
7740: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
7750: 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
7760: 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
7770: 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
7780: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
7790: 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
77a0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
77b0: 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
77c0: 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
77d0: 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
77e0: 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
77f0: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
7800: 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
7810: 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
7820: 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 74 68 65  al file then the
7830: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 6c   database will l
7840: 69 6b 65 6c 79 20 61 6c 72 65 61 64 79 20 62 65  ikely already be
7850: 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 73  .** corrupted, s
7860: 6f 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f  o the PAGER_ERR_
7870: 43 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73  CORRUPT bit is s
7880: 65 74 20 69 6e 20 70 50 61 67 65 72 2d 3e 65 72  et in pPager->er
7890: 72 4d 61 73 6b 0a 2a 2a 20 61 6e 64 20 53 51 4c  rMask.** and SQL
78a0: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
78b0: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20  eturned.  If it 
78c0: 61 6c 6c 20 77 6f 72 6b 73 2c 20 74 68 65 6e 20  all works, then 
78d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
78e0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
78f0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
7900: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
7910: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
7920: 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a  nt useJournalSiz
7930: 65 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b  e){.  off_t szJ;
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7950: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
7960: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
7970: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  tes */.  int nRe
7980: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7990: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
79a0: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
79b0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
79c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79d0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
79e0: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
79f0: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
7a00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
7a10: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
7a20: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 6e 73  n pages */.  uns
7a30: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
7a40: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
7a50: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
7a60: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
7a70: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
7a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
7a90: 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
7aa0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
7ab0: 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
7ac0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7ad0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
7ae0: 6e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  name of master j
7af0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 63 68 61 72  ournal */.  char
7b00: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
7b10: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7b20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7b30: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
7b40: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
7b50: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
7b60: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
7b70: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
7b80: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
7b90: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
7ba0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
7bb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
7bc0: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  n );.  sqlite3Os
7bd0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
7be0: 64 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  d, 0);.  rc = sq
7bf0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
7c00: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  &pPager->jfd, &s
7c10: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
7c20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7c30: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
7c40: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
7c50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7c60: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f   is too small to
7c70: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c   contain a compl
7c80: 65 74 65 20 68 65 61 64 65 72 2c 0a 20 20 2a 2a  ete header,.  **
7c90: 20 69 74 20 6d 75 73 74 20 6d 65 61 6e 20 74 68   it must mean th
7ca0: 61 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  at the process t
7cb0: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20  hat created the 
7cc0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
7cd0: 0a 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  .  ** beginning 
7ce0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  to write the jou
7cf0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
7d00: 74 20 64 69 65 64 2e 20 20 49 6e 20 74 68 61 74  t died.  In that
7d10: 20 63 61 73 65 2c 0a 20 20 2a 2a 20 74 68 65 20   case,.  ** the 
7d20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
7d30: 6f 75 6c 64 20 68 61 76 65 20 73 74 69 6c 6c 20  ould have still 
7d40: 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20  been completely 
7d50: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 20  unchanged..  ** 
7d60: 4e 6f 74 68 69 6e 67 20 6e 65 65 64 73 20 74 6f  Nothing needs to
7d70: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
7d80: 20 20 57 65 20 63 61 6e 20 73 61 66 65 6c 79 20    We can safely 
7d90: 69 67 6e 6f 72 65 20 74 68 69 73 20 6a 6f 75 72  ignore this jour
7da0: 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
7db0: 73 7a 4a 20 3c 20 32 34 20 29 7b 0a 20 20 20 20  szJ < 24 ){.    
7dc0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
7dd0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 28 31 29  k;.  }..  /* (1)
7de0: 20 52 65 61 64 20 74 68 65 20 62 65 67 69 6e 6e   Read the beginn
7df0: 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
7e00: 61 6c 20 61 6e 64 20 76 65 72 69 66 79 20 74 68  al and verify th
7e10: 65 20 6d 61 67 69 63 20 73 74 72 69 6e 67 0a 20  e magic string. 
7e20: 20 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e   ** at the begin
7e30: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
7e40: 6e 61 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  nal. */.  rc = s
7e50: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
7e60: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
7e70: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
7e80: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
7e90: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d  LITE_OK || memcm
7ea0: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
7eb0: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
7ec0: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
7ed0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
7ee0: 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74  ROTOCOL;.    got
7ef0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
7f00: 20 20 7d 0a 0a 20 20 2f 2a 20 28 32 29 20 52 65    }..  /* (2) Re
7f10: 61 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ad the number of
7f20: 20 70 61 67 65 73 20 73 74 6f 72 65 64 20 69 6e   pages stored in
7f30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 2a   the journal.  *
7f40: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  /.  rc = read32b
7f50: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
7f60: 2c 20 28 75 33 32 2a 29 26 6e 52 65 63 29 3b 0a  , (u32*)&nRec);.
7f70: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
7f80: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
7f90: 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
7fa0: 66 66 66 66 20 7c 7c 20 75 73 65 4a 6f 75 72 6e  ffff || useJourn
7fb0: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 6e 52  alSize ){.    nR
7fc0: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
7fd0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7fe0: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
7ff0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
8000: 20 20 2f 2a 20 28 33 29 20 52 65 61 64 20 74 68    /* (3) Read th
8010: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
8020: 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63  for the sanity c
8030: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 72 63 20  hecksum */.  rc 
8040: 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50  = read32bits(&pP
8050: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
8060: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
8070: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
8080: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 0a 20  end_playback;.. 
8090: 20 2f 2a 20 28 34 29 20 52 65 61 64 20 74 68 65   /* (4) Read the
80a0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
80b0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
80c0: 20 66 69 6c 65 20 70 72 69 6f 72 20 74 6f 20 74   file prior to t
80d0: 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66  he.  ** start of
80e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
80f0: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
8100: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
8110: 66 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69 66  fd, &mxPg);.  if
8120: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8130: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
8140: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
8150: 20 2f 2a 20 28 35 29 20 61 6e 64 20 28 36 29 3a   /* (5) and (6):
8160: 20 43 68 65 63 6b 20 69 66 20 61 20 6d 61 73 74   Check if a mast
8170: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
8180: 69 73 20 73 70 65 63 69 66 69 65 64 2e 20 49 66  is specified. If
8190: 20 6f 6e 65 20 69 73 0a 20 20 2a 2a 20 73 70 65   one is.  ** spe
81a0: 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 70 72 6f  cified, only pro
81b0: 63 65 65 64 20 77 69 74 68 20 74 68 65 20 70 6c  ceed with the pl
81c0: 61 79 62 61 63 6b 20 69 66 20 69 74 20 73 74 69  ayback if it sti
81d0: 6c 6c 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  ll exists. */.  
81e0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
81f0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6e  &pPager->jfd, &n
8200: 4d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72  Master);.  if( r
8210: 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61  c ) goto end_pla
8220: 79 62 61 63 6b 3b 0a 20 20 69 66 28 20 6e 4d 61  yback;.  if( nMa
8230: 73 74 65 72 3e 30 20 29 7b 0a 20 20 20 20 7a 4d  ster>0 ){.    zM
8240: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 4d 61  aster = sqliteMa
8250: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 29 3b 0a 20  lloc(nMaster);. 
8260: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
8270: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
8280: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
8290: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
82a0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ack;.    }.    r
82b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
82c0: 64 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  d(&pPager->jfd, 
82d0: 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
82e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
82f0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61  QLITE_OK || (zMa
8300: 73 74 65 72 5b 30 5d 20 26 26 20 21 73 71 6c 69  ster[0] && !sqli
8310: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
8320: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
8330: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
8340: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  back;.    }.  }.
8350: 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
8360: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8370: 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72   back to it's or
8380: 69 67 69 6e 61 6c 20 73 69 7a 65 20 2a 2f 0a 20  iginal size */. 
8390: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
83a0: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c  >origDbSize==0 |
83b0: 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  | pPager->origDb
83c0: 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20  Size==mxPg );.  
83d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
83e0: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
83f0: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
8400: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67  SIZE*(off_t)mxPg
8410: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8420: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
8430: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
8440: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
8450: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
8460: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
8470: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
8480: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
8490: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
84a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
84b0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
84c0: 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
84d0: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
84e0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
84f0: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ger, &pPager->jf
8500: 64 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  d, 1);.    if( r
8510: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8520: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
8530: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
8540: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
8550: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
8560: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8570: 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20    }..  /* Pages 
8580: 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77  that have been w
8590: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
85a0: 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20  urnal but never 
85b0: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72  synced.  ** wher
85c0: 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62  e not restored b
85d0: 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65  y the loop above
85e0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65  .  We have to re
85f0: 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a  store those.  **
8600: 20 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e   pages by readin
8610: 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d  g them back from
8620: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
8630: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
8640: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8650: 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
8660: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
8670: 72 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61  r);.  }..end_pla
8680: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 7a 4d 61  yback:.  if( zMa
8690: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
86a0: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
86b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
86c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
86d0: 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a  ll return true,.
86e0: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
86f0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
8700: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
8710: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 65 72  r journal. If er
8720: 72 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f 63 63  rors .    ** occ
8730: 75 72 20 64 75 72 69 6e 67 20 74 68 69 73 20 70  ur during this p
8740: 72 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65 20 74  rocess, ignore t
8750: 68 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  hem..    */.    
8760: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8770: 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
8780: 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74  _delmaster(zMast
8790: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
87a0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
87b0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
87c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
87d0: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 57 65     /* FIX ME: We
87e0: 20 73 68 6f 75 6c 64 6e 27 74 20 64 65 6c 65 74   shouldn't delet
87f0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  e the journal if
8800: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
8810: 64 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20  d during.    ** 
8820: 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 20 6d 61 79  rollback. It may
8830: 20 68 61 76 65 20 62 65 65 6e 20 61 20 74 72 61   have been a tra
8840: 6e 73 69 65 6e 74 20 65 72 72 6f 72 20 61 6e 64  nsient error and
8850: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   the rollback ma
8860: 79 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64  y.    ** succeed
8870: 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
8880: 20 61 74 74 65 6d 70 74 65 64 2e 0a 20 20 20 20   attempted..    
8890: 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77  */.    pager_unw
88a0: 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
88b0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
88c0: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
88d0: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  RR_CORRUPT;.    
88e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
88f0: 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UPT;.  }else{.  
8900: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
8910: 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
8920: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8930: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
8940: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
8950: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
8960: 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
8970: 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
8980: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
8990: 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
89a0: 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
89b0: 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
89c0: 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
89d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
89e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
89f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
8a00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
8a10: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f  statement is sto
8a20: 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73  red in pPager->s
8a30: 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  tmtSize, not in 
8a40: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
8a50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
8a60: 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
8a70: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
8a80: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
8a90: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
8aa0: 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
8ab0: 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
8ac0: 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
8ad0: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
8ae0: 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
8af0: 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
8b00: 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  t pPager->stmtJS
8b10: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
8b20: 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c  nt pager_stmt_pl
8b30: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
8b40: 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73  ager){.  off_t s
8b50: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
8b60: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
8b70: 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
8b80: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8ba0: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
8bb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8bd0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
8be0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  /.  int rc;..  /
8bf0: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
8c00: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
8c10: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
8c20: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
8c30: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
8c40: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  (&pPager->fd, SQ
8c50: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28  LITE_PAGE_SIZE*(
8c60: 6f 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 73 74  off_t)pPager->st
8c70: 6d 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  mtSize);.  pPage
8c80: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
8c90: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20  er->stmtSize;.. 
8ca0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
8cb0: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
8cc0: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
8cd0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
8ce0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
8cf0: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
8d00: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
8d10: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
8d20: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
8d30: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
8d40: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
8d50: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
8d60: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
8d70: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
8d80: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
8d90: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
8da0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
8db0: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
8dc0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
8dd0: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
8de0: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
8df0: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
8e00: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
8e10: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
8e20: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
8e30: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
8e40: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
8e50: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
8e60: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
8e70: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
8e80: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
8e90: 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20   &pPager->stfd, 
8ea0: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
8eb0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
8ec0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8ed0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
8ee0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
8ef0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  k;.  }..  /* Fig
8f00: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
8f10: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
8f20: 65 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  e copied out of 
8f30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
8f40: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20    ** journal..  
8f50: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
8f60: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
8f70: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74  >jfd, pPager->st
8f80: 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
8f90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8fa0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74  .    goto end_st
8fb0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
8fc0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8fd0: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
8fe0: 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
8ff0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9000: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
9010: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
9020: 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28  ;.  }.  nRec = (
9030: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 73 74  szJ - pPager->st
9040: 6d 74 4a 53 69 7a 65 29 2f 4a 4f 55 52 4e 41 4c  mtJSize)/JOURNAL
9050: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
9060: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
9070: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
9080: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
9090: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
90a0: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ger, &pPager->jf
90b0: 64 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  d, 1);.    if( r
90c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
90d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
90e0: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
90f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
9100: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
9110: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f     }.  }.  .end_
9120: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
9130: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9140: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
9150: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
9160: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
9170: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9180: 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72  CORRUPT;.  }.  r
9190: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
91a0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
91b0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
91c0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
91d0: 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
91e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
91f0: 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68  mum number is th
9200: 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  e absolute value
9210: 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20 70   of the mxPage p
9220: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20  arameter..** If 
9230: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
9240: 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66  ve, the noSync f
9250: 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e  lag is also set.
9260: 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65    noSync bypasse
9270: 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  s.** calls to sq
9280: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 2e 20 20  lite3OsSync().  
9290: 54 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d  The pager runs m
92a0: 75 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20  uch faster with 
92b0: 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75  noSync on,.** bu
92c0: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
92d0: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
92e0: 73 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e  s or there is an
92f0: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a   abrupt power .*
9300: 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  * failure, the d
9310: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67  atabase file mig
9320: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ht be left in an
9330: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
9340: 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c  d.** unrepairabl
9350: 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f  e state.  .*/.vo
9360: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
9370: 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61  set_cachesize(Pa
9380: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
9390: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
93a0: 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  mxPage>=0 ){.   
93b0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
93c0: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
93d0: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  le;.    if( pPag
93e0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
93f0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
9400: 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0; .  }else{.   
9410: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
9420: 3d 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20  = 1;.    mxPage 
9430: 3d 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20  = -mxPage;.  }. 
9440: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
9450: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
9460: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
9470: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75   }.}../*.** Adju
9480: 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
9490: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
94a0: 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
94b0: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
94c0: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
94d0: 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
94e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
94f0: 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
9500: 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
9510: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
9520: 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
9530: 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
9540: 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
9550: 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
9560: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
9570: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
9590: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
95a0: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
95b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
95c0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
95d0: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
95e0: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
95f0: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
9600: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
9610: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
9620: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
9630: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
9640: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
9650: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
9660: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
9670: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
9680: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
9690: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
96a0: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
96b0: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
96c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
96e0: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
96f0: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
9700: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
9710: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9720: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
9730: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
9740: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
9750: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
9760: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
9770: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
9780: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
9790: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
97a0: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
97b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
97c0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
97e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
97f0: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
9800: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
9810: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
9820: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
9830: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
9840: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
9850: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
9860: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
9870: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
9880: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
9890: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
98a0: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
98b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
98c0: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
98d0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
98e0: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
98f0: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
9900: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
9910: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
9920: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
9930: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
9940: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
9950: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
9960: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
9970: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69  d FULL=3..*/.voi
9980: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
9990: 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28  et_safety_level(
99a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
99b0: 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61  nt level){.  pPa
99c0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c  ger->noSync =  l
99d0: 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65  evel==1 || pPage
99e0: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
99f0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
9a00: 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70  = level==3 && !p
9a10: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
9a20: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
9a30: 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
9a40: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
9a50: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
9a60: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57  mporary file.  W
9a70: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
9a80: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a   the file into z
9a90: 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d  Name.** (zName m
9aa0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
9ab0: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
9ac0: 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e  SIZE bytes long.
9ad0: 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  )  Write.** the 
9ae0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9af0: 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
9b00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
9b10: 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
9b20: 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
9b30: 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a  de if we fail..*
9b40: 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c  *.** The OS will
9b50: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
9b60: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
9b70: 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
9b80: 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a   is.** closed..*
9b90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
9ba0: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
9bb0: 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  mp(char *zFile, 
9bc0: 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69  OsFile *fd){.  i
9bd0: 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e  nt cnt = 8;.  in
9be0: 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  t rc;.  do{.    
9bf0: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
9c00: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
9c10: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20  (zFile);.    rc 
9c20: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
9c30: 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20  xclusive(zFile, 
9c40: 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65  fd, 1);.  }while
9c50: 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53  ( cnt>0 && rc!=S
9c60: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
9c70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9c80: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
9c90: 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75  age cache and pu
9ca0: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
9cb0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e  he page cache in
9cc0: 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68   *ppPager..** Th
9cd0: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
9ce0: 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69  hed need not exi
9cf0: 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73  st.  The file is
9d00: 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69   not locked unti
9d10: 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  l.** the first c
9d20: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61  all to sqlite3pa
9d30: 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73  ger_get() and is
9d40: 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
9d50: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
9d60: 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
9d70: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
9d80: 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a  pager_unref()..*
9d90: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
9da0: 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
9db0: 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
9dc0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
9dd0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
9de0: 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
9df0: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
9e00: 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
9e10: 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
9e20: 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
9e30: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  it is closed..*/
9e40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
9e50: 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20  r_open(.  Pager 
9e60: 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
9e70: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
9e80: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
9e90: 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
9ea0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
9eb0: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
9ec0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9ed0: 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
9ee0: 74 20 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20  t mxPage,       
9ef0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75         /* Max nu
9f00: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
9f10: 79 20 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f  y cache pages */
9f20: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9f40: 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
9f50: 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
9f60: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
9f70: 74 20 75 73 65 4a 6f 75 72 6e 61 6c 2c 20 20 20  t useJournal,   
9f80: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74         /* TRUE t
9f90: 6f 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  o use a rollback
9fa0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
9fb0: 20 66 69 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20   file */.  void 
9fc0: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 20 20   *pBusyHandler  
9fd0: 20 20 20 20 2f 2a 20 42 75 73 79 20 63 61 6c 6c      /* Busy call
9fe0: 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  back */.){.  Pag
9ff0: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68  er *pPager;.  ch
a000: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
a010: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d  e = 0;.  int nam
a020: 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66  eLen;.  OsFile f
a030: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
a040: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
a050: 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
a060: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44   = 0;.  int memD
a070: 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
a080: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61  dOnly = 0;.  cha
a090: 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
a0a0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a  EMPNAME_SIZE];..
a0b0: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
a0c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61    if( sqlite3_ma
a0d0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20  lloc_failed ){. 
a0e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a0f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
a100: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
a110: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
a120: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
a130: 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
a140: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
a150: 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
a160: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
a170: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 34 29   sqliteMalloc(4)
a180: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  ;.      if( zFul
a190: 6c 50 61 74 68 6e 61 6d 65 20 29 20 73 74 72 63  lPathname ) strc
a1a0: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
a1b0: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 63 20  , "");.      rc 
a1c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
a1d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 46   }else{.      zF
a1e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
a1f0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
a200: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
a210: 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50        if( zFullP
a220: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
a230: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a240: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a  sOpenReadWrite(z
a250: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66  FullPathname, &f
a260: 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20  d, &readOnly);. 
a270: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a280: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
a290: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
a2a0: 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29  temp(zTemp, &fd)
a2b0: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
a2c0: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75  = zTemp;.    zFu
a2d0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
a2e0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
a2f0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
a300: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a310: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65  E_OK ){.      te
a320: 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
a330: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 46 75  }.  }.  if( !zFu
a340: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
a350: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a360: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
a370: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a380: 7b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 46 69  {.    if( tempFi
a390: 6c 65 20 29 20 73 71 6c 69 74 65 33 4f 73 43 6c  le ) sqlite3OsCl
a3a0: 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 69 66  ose(&fd);.    if
a3b0: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
a3c0: 29 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75  ) sqliteFree(zFu
a3d0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
a3e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
a3f0: 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c    nameLen = strl
a400: 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  en(zFullPathname
a410: 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  );.  pPager = sq
a420: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
a430: 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61  of(*pPager) + na
a440: 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a  meLen*3 + 30 );.
a450: 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20    if( pPager==0 
a460: 29 7b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 46  ){.    if( tempF
a470: 69 6c 65 20 29 20 73 71 6c 69 74 65 33 4f 73 43  ile ) sqlite3OsC
a480: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 69  lose(&fd);.    i
a490: 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  f( zFullPathname
a4a0: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46   ) sqliteFree(zF
a4b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
a4c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4d0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 45 54  NOMEM;.  }.  SET
a4e0: 5f 50 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a  _PAGER(pPager);.
a4f0: 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
a500: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
a510: 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
a520: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20  r->zDirectory = 
a530: 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  &pPager->zFilena
a540: 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  me[nameLen+1];. 
a550: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
a560: 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69  l = &pPager->zDi
a570: 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b  rectory[nameLen+
a580: 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  1];.  strcpy(pPa
a590: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
a5a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
a5b0: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
a5c0: 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75  >zDirectory, zFu
a5d0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 66  llPathname);.  f
a5e0: 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e  or(i=nameLen; i>
a5f0: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
a600: 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
a610: 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
a620: 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
a630: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
a640: 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  0;.  strcpy(pPag
a650: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46  er->zJournal, zF
a660: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
a670: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
a680: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
a690: 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
a6a0: 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20  urnal[nameLen], 
a6b0: 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70  "-journal");.  p
a6c0: 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a  Pager->fd = fd;.
a6d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
a6e0: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61  lOpen = 0;.  pPa
a6f0: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
a700: 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  = useJournal && 
a710: 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  !memDb;.  pPager
a720: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
a730: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
a740: 55 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Use = 0;.  pPage
a750: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70  r->nRef = 0;.  p
a760: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
a770: 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65  memDb-1;.  pPage
a780: 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51  r->pageSize = SQ
a790: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  LITE_PAGE_SIZE;.
a7a0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
a7b0: 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ze = 0;.  pPager
a7c0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
a7d0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
a7e0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a7f0: 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e  mxPage = mxPage>
a800: 35 20 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b  5 ? mxPage : 10;
a810: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
a820: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
a830: 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  .  pPager->errMa
a840: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  sk = 0;.  pPager
a850: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
a860: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
a870: 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
a880: 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
a890: 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
a8a0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
a8b0: 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
a8c0: 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
a8d0: 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75  ->tempFile || !u
a8e0: 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
a8f0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
a900: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
a910: 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70  tSynced = 0;.  p
a920: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
a930: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ;.  pPager->nExt
a940: 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70  ra = nExtra;.  p
a950: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
a960: 6c 65 72 20 3d 20 28 42 75 73 79 48 61 6e 64 6c  ler = (BusyHandl
a970: 65 72 20 2a 29 70 42 75 73 79 48 61 6e 64 6c 65  er *)pBusyHandle
a980: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  r;.  memset(pPag
a990: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
a9a0: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
a9b0: 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72  sh));.  *ppPager
a9c0: 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
a9d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a9e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
a9f0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
aa00: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
aa10: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
aa20: 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
aa30: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
aa40: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
aa50: 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
aa60: 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
aa70: 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
aa80: 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
aa90: 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
aaa0: 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
aab0: 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
aac0: 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
aad0: 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
aae0: 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
aaf0: 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
ab00: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e  e3pager_close().
ab10: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
ab20: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
ab30: 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67 65  d by sqlite3page
ab40: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  r_unref()..*/.vo
ab50: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
ab60: 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50  set_destructor(P
ab70: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
ab80: 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64  id (*xDesc)(void
ab90: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
aba0: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
abb0: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
abc0: 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
abd0: 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
abe0: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
abf0: 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
ac00: 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
ac10: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
ac20: 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
ac30: 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
ac40: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
ac50: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
ac60: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
ac70: 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
ac80: 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
ac90: 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
aca0: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
acb0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
acc0: 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
acd0: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
ace0: 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
acf0: 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
ad00: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72  lite3pager_set_r
ad10: 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
ad20: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
ad30: 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74  einit)(void*,int
ad40: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
ad50: 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
ad60: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
ad70: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
ad80: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
ad90: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
ada0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
adb0: 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20   pPager..*/.int 
adc0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
add0: 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
ade0: 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e  ager){.  off_t n
adf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ae00: 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
ae10: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
ae20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
ae30: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
ae40: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
ae50: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
ae60: 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c  er->fd, &n)!=SQL
ae70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
ae80: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
ae90: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b   PAGER_ERR_DISK;
aea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
aeb0: 20 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45   }.  n /= SQLITE
aec0: 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66  _PAGE_SIZE;.  if
aed0: 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
aee0: 20 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   && n==PENDING_B
aef0: 59 54 45 2f 53 51 4c 49 54 45 5f 50 41 47 45 5f  YTE/SQLITE_PAGE_
af00: 53 49 5a 45 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  SIZE ){.    n++;
af10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
af20: 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
af30: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50  UNLOCK ){.    pP
af40: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
af50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
af60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
af70: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
af80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
af90: 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 2c  cJournal(Pager*,
afa0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a   const char*);..
afb0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
afc0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
afd0: 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
afe0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
aff0: 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
b000: 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
b010: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
b020: 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
b030: 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
b040: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
b050: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
b060: 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
b070: 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
b080: 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
b090: 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
b0a0: 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
b0b0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
b0c0: 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
b0d0: 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
b0e0: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
b0f0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
b100: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
b110: 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
b120: 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
b130: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
b140: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
b150: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
b160: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
b170: 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
b180: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
b190: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
b1a0: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
b1b0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
b1c0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
b1d0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
b1e0: 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
b1f0: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
b200: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
b210: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
b220: 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
b230: 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
b240: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
b250: 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
b260: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
b270: 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
b280: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
b290: 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
b2a0: 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
b2b0: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
b2c0: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
b2d0: 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
b2e0: 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
b2f0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
b300: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
b310: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
b320: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
b330: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
b340: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
b350: 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
b360: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
b370: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
b380: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
b390: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
b3a0: 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50   = pager_hash(pP
b3b0: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
b3c0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
b3d0: 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20  ash[h]==pPg );. 
b3e0: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
b3f0: 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
b400: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Hash;.  }.  pPg-
b410: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
b420: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
b430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
b440: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
b450: 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e  o truncate an in
b460: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
b470: 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c  .  Delete.** all
b480: 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e   pages whose pgn
b490: 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  o is larger than
b4a0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
b4b0: 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
b4c0: 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ced..** Referenc
b4d0: 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
b4e0: 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
b4f0: 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
b500: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
b510: 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61  emoryTruncate(Pa
b520: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
b530: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
b540: 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
b550: 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
b560: 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
b570: 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
b580: 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
b590: 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
b5a0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
b5b0: 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
b5c0: 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
b5d0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
b5e0: 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
b5f0: 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
b600: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
b610: 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
b620: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
b630: 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
b640: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
b650: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
b660: 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
b670: 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  ll;.      unlink
b680: 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
b690: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
b6a0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
b6b0: 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
b6c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e   }.}../*.** Trun
b6d0: 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
b6e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
b6f0: 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
b700: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
b710: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
b720: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
b730: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
b740: 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
b750: 3e 64 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20  >dbSize<0 ){.   
b760: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
b770: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
b780: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
b790: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
b7a0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
b7b0: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
b7c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
b7d0: 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
b7e0: 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  =(unsigned)pPage
b7f0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
b800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b810: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  K;.  }.  if( pPa
b820: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
b830: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
b840: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
b850: 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
b860: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
b870: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
b880: 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
b890: 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
b8a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b8b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
b8c0: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
b8d0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
b8e0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  e(&pPager->fd, S
b8f0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
b900: 28 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a 20  (off_t)nPage);. 
b910: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b920: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
b930: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
b940: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b950: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
b960: 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
b970: 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
b980: 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
b990: 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
b9a0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
b9b0: 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
b9c0: 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
b9d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
b9e0: 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
b9f0: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
ba00: 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
ba10: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
ba20: 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
ba30: 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
ba40: 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
ba50: 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
ba60: 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
ba70: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
ba80: 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
ba90: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
baa0: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
bab0: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
bac0: 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  edump..*/.int sq
bad0: 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
bae0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
baf0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
bb00: 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28  pNext;.  switch(
bb10: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29   pPager->state )
bb20: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
bb30: 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63  _RESERVED:.    c
bb40: 61 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ase PAGER_SYNCED
bb50: 3a 20 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  : .    case PAGE
bb60: 52 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20  R_EXCLUSIVE: {. 
bb70: 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
bb80: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
bb90: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
bba0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
bbb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
bbc0: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
bbd0: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
bbe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
bbf0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
bc00: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
bc10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bc20: 7d 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  }.    case PAGER
bc30: 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20  _SHARED: {.     
bc40: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
bc50: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mDb ){.        s
bc60: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
bc70: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
bc80: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
bc90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bca0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
bcb0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
bcc0: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ing */.      bre
bcd0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
bce0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
bcf0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
bd00: 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e  Next){.#ifndef N
bd10: 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 50  DEBUG.    if( pP
bd20: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
bd30: 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
bd40: 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
bd50: 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
bd60: 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
bd70: 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
bd80: 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
bd90: 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
bda0: 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
bdb0: 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
bdc0: 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
bdd0: 6e 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20 3d  ndif.    pNext =
bde0: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
bdf0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
be00: 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  Pg);.  }.  if( !
be10: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
be20: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
be30: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ose(&pPager->fd)
be40: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
be50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
be60: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54  pen==0 );.  /* T
be70: 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75  emp files are au
be80: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
be90: 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20  ted by the OS.  
bea0: 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  ** if( pPager->t
beb0: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20  empFile ){.  ** 
bec0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
bed0: 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
bee0: 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a  ame);.  ** }.  *
bef0: 2f 0a 20 20 43 4c 52 5f 50 41 47 45 52 28 70 50  /.  CLR_PAGER(pP
bf00: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
bf10: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d  ger->zFilename!=
bf20: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
bf30: 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ] ){.    assert(
bf40: 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74   0 );  /* Cannot
bf50: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 73   happen */.    s
bf60: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
bf70: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
bf80: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
bf90: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
bfa0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
bfb0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
bfc0: 79 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  y);.  }.  sqlite
bfd0: 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Free(pPager);.  
bfe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bff0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c000: 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
c010: 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
c020: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
c030: 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  no sqlite3pager_
c040: 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20  pagenumber(void 
c050: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
c060: 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47   *p = DATA_TO_PG
c070: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
c080: 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
c090: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f  ./*.** The page_
c0a0: 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ref() function i
c0b0: 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65  ncrements the re
c0c0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
c0d0: 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20  r a page..** If 
c0e0: 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  the page is curr
c0f0: 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
c100: 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72  elist (the refer
c110: 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
c120: 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f  ro) then.** remo
c130: 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66  ve it from the f
c140: 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46  reelist..**.** F
c150: 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74  or non-test syst
c160: 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20  ems, page_ref() 
c170: 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20  is a macro that 
c180: 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28  calls _page_ref(
c190: 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74  ).** online of t
c1a0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
c1b0: 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72  nt is zero.  For
c1c0: 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70   test systems, p
c1d0: 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20  age_ref().** is 
c1e0: 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
c1f0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  so that we can s
c200: 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61  et breakpoints a
c210: 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a  nd trace it..*/.
c220: 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67  static void _pag
c230: 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
c240: 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  ){.  if( pPg->nR
c250: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ef==0 ){.    /* 
c260: 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  The page is curr
c270: 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
c280: 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69  elist.  Remove i
c290: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  t. */.    if( pP
c2a0: 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  g==pPg->pPager->
c2b0: 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
c2c0: 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d        PgHdr *p =
c2d0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
c2e0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
c2f0: 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
c300: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
c310: 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d  ee; }.      pPg-
c320: 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
c330: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d  ynced = p;.    }
c340: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
c350: 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
c360: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
c370: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
c380: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
c390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
c3a0: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
c3b0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
c3c0: 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ee;.    }.    if
c3d0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
c3e0: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
c3f0: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
c400: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
c410: 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
c420: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
c430: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
c440: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
c450: 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  }.    pPg->pPage
c460: 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
c470: 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
c480: 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a  REFINFO(pPg);.}.
c490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
c4a0: 53 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  ST.  static void
c4b0: 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20   page_ref(PgHdr 
c4c0: 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70  *pPg){.    if( p
c4d0: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
c4e0: 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70       _page_ref(p
c4f0: 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
c500: 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b        pPg->nRef+
c510: 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f  +;.      REFINFO
c520: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
c530: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
c540: 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28  page_ref(P)   ((
c550: 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67  P)->nRef==0?_pag
c560: 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28  e_ref(P):(void)(
c570: 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64  P)->nRef++).#end
c580: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
c590: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
c5a0: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
c5b0: 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70  ge.  The input p
c5c0: 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72  ointer is.** a r
c5d0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
c5e0: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e  page data..*/.in
c5f0: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
c600: 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
c610: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
c620: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
c630: 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66  ata);.  page_ref
c640: 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
c650: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c660: 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
c670: 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
c680: 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
c690: 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
c6a0: 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
c6b0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
c6c0: 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
c6d0: 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
c6e0: 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
c6f0: 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
c700: 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
c710: 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
c720: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
c730: 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
c740: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
c750: 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
c760: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
c770: 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
c780: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
c790: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
c7a0: 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
c7b0: 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
c7c0: 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
c7d0: 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
c7e0: 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
c7f0: 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
c800: 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
c810: 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
c820: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
c830: 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
c840: 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
c850: 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
c860: 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
c870: 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
c880: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
c890: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
c8a0: 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
c8b0: 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
c8c0: 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
c8d0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
c8e0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
c8f0: 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
c900: 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
c910: 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
c920: 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
c930: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
c940: 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
c950: 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
c960: 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
c970: 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
c980: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
c990: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
c9a0: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
c9b0: 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
c9c0: 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
c9d0: 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
c9e0: 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63  ure, so sync occ
c9f0: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  urs..**.** This 
ca00: 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
ca10: 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
ca20: 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
ca30: 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
ca40: 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
ca50: 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
ca60: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
ca70: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
ca80: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 50 67 48 64  zMaster){.  PgHd
ca90: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
caa0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
cab0: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
cac0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
cad0: 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
cae0: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
caf0: 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
cb00: 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
cb10: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
cb20: 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
cb30: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
cb40: 63 20 7c 7c 20 7a 4d 61 73 74 65 72 20 29 7b 0a  c || zMaster ){.
cb50: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
cb60: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
cb70: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
cb80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
cb90: 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  ;.      /* asser
cba0: 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
cbb0: 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20  nc ); // noSync 
cbc0: 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20  might be set if 
cbd0: 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20  synchronous.    
cbe0: 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20    ** was turned 
cbf0: 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72  off after the tr
cc00: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
cc10: 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23  arted.  Ticket #
cc20: 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  615 */.#ifndef N
cc30: 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20  DEBUG.      {.  
cc40: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
cc50: 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e  re the pPager->n
cc60: 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61  Rec counter we a
cc70: 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65  re keeping agree
cc80: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  s.        ** wit
cc90: 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75  h the nRec compu
cca0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  ted from the siz
ccb0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
ccc0: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
ccd0: 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  /.        off_t 
cce0: 68 64 72 53 7a 2c 20 70 67 53 7a 2c 20 6a 53 7a  hdrSz, pgSz, jSz
ccf0: 3b 0a 20 20 20 20 20 20 20 20 68 64 72 53 7a 20  ;.        hdrSz 
cd00: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
cd10: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
cd20: 20 20 70 67 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c    pgSz = JOURNAL
cd30: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
cd40: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
cd50: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
cd60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
cd70: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
cd80: 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
cd90: 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
cda0: 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a  t( pPager->nRec*
cdb0: 70 67 53 7a 2b 68 64 72 53 7a 3d 3d 6a 53 7a 20  pgSz+hdrSz==jSz 
cdc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
cdd0: 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
cde0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
cdf0: 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
ce00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ce10: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 20 20  header */.      
ce20: 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20 20 20    off_t szJ;.   
ce30: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
ce40: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
ce50: 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53         TRACE2("S
ce60: 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
ce70: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
ce80: 2e 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  .h);.          r
ce90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
cea0: 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  c(&pPager->jfd);
ceb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
cec0: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
ced0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cee0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
cef0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
cf00: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
cf10: 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
cf20: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
cf30: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
cf40: 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20  Pager->nRec);.  
cf50: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
cf60: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
cf70: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
cf80: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6d 61 73 74  name of the mast
cf90: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cfa0: 69 66 20 6f 6e 65 20 69 73 20 73 70 65 63 69 66  if one is specif
cfb0: 69 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ied */.        i
cfc0: 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( zMaster ){.  
cfd0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
cfe0: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3c  strlen(zMaster)<
cff0: 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20  pPager->nMaster 
d000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
d010: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
d020: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 32 30  &pPager->jfd, 20
d030: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
d040: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
d050: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
d060: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
d070: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
d080: 73 74 65 72 2c 20 73 74 72 6c 65 6e 28 7a 4d 61  ster, strlen(zMa
d090: 73 74 65 72 29 2b 31 29 3b 0a 20 20 20 20 20 20  ster)+1);.      
d0a0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
d0b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
d0c0: 7d 0a 0a 20 20 20 20 20 20 20 20 73 7a 4a 20 3d  }..        szJ =
d0d0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d0e0: 70 50 61 67 65 72 29 20 2b 20 20 70 50 61 67 65  pPager) +  pPage
d0f0: 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f  r->nRec*JOURNAL_
d100: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
d110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
d120: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
d130: 64 2c 20 73 7a 4a 29 3b 0a 20 20 20 20 20 20 7d  d, szJ);.      }
d140: 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53  .      TRACE2("S
d150: 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
d160: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
d170: 2e 68 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  .h);.      rc = 
d180: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
d190: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
d1a0: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
d1b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
d1c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
d1d0: 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
d1e0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
d1f0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
d200: 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65   /* Erase the ne
d210: 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d  edSync flag from
d220: 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20   every page..   
d230: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   */.    for(pPg=
d240: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
d250: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
d260: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
d270: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
d280: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
d290: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
d2a0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
d2b0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
d2c0: 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
d2d0: 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
d2e0: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
d2f0: 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
d300: 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
d310: 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
d320: 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
d330: 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
d340: 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
d350: 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
d360: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72  .  else{.    for
d370: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
d380: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
d390: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
d3a0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
d3b0: 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
d3c0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
d3d0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
d3e0: 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46  nced==pPager->pF
d3f0: 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  irst );.  }.#end
d400: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
d410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
d420: 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  a list of pages 
d430: 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68  (connected by th
d440: 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
d450: 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a  ointer) write.**
d460: 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68   every one of th
d470: 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f  ose pages out to
d480: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d490: 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d  le and mark them
d4a0: 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e   all.** as clean
d4b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d4c0: 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
d4d0: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
d4e0: 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
d4f0: 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ger;.  int rc;. 
d500: 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 0a   int busy = 1;..
d510: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d520: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d530: 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
d540: 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
d550: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
d560: 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
d570: 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
d580: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
d590: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
d5a0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
d5b0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
d5c0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
d5d0: 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
d5e0: 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  g.  ** calls to 
d5f0: 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
d600: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a  are no-ops..  **
d610: 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
d620: 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
d630: 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
d640: 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
d650: 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
d660: 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
d670: 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
d680: 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
d690: 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
d6a0: 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
d6b0: 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
d6c0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
d6d0: 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
d6e0: 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
d6f0: 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
d700: 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
d710: 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
d720: 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
d730: 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
d740: 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
d750: 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
d760: 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
d770: 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
d780: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
d790: 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
d7a0: 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
d7b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
d7c0: 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
d7d0: 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
d7e0: 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
d7f0: 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
d800: 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
d810: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
d820: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
d830: 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
d840: 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
d850: 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
d860: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
d870: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
d880: 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
d890: 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
d8a0: 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
d8b0: 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
d8c0: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
d8d0: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
d8e0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
d8f0: 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  USIVE_LOCK);.  }
d900: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
d910: 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20 20 20  E_BUSY && .     
d920: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
d930: 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20  ndler && .      
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 20 26 26 20 0a  dler->xFunc && .
d960: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
d970: 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e  usyHandler->xFun
d980: 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  c(pPager->pBusyH
d990: 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75  andler->pArg, bu
d9a0: 73 79 2b 2b 29 0a 20 20 29 3b 0a 20 20 69 66 28  sy++).  );.  if(
d9b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d9c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d9d0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
d9e0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
d9f0: 4c 55 53 49 56 45 3b 0a 0a 20 20 77 68 69 6c 65  LUSIVE;..  while
da00: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61  ( pList ){.    a
da10: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
da20: 72 74 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  rty );.    sqlit
da30: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
da40: 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67  ->fd, (pList->pg
da50: 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
da60: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
da70: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
da80: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
da90: 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
daa0: 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 54 52 41  gno, 6);.    TRA
dab0: 43 45 32 28 22 53 54 4f 52 45 20 70 61 67 65 20  CE2("STORE page 
dac0: 25 64 5c 6e 22 2c 20 70 4c 69 73 74 2d 3e 70 67  %d\n", pList->pg
dad0: 6e 6f 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  no);.    rc = sq
dae0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
daf0: 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
db00: 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
db10: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
db20: 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61  );.    CODEC(pPa
db30: 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
db40: 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
db50: 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
db60: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
db70: 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
db80: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c  irty = 0;.    pL
db90: 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
dba0: 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
dbb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
dbc0: 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
dbd0: 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
dbe0: 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
dbf0: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
dc00: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
dc10: 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
dc20: 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
dc30: 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
dc40: 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
dc50: 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
dc60: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
dc70: 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
dc80: 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
dc90: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
dca0: 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70   *p, *pList;.  p
dcb0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
dcc0: 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
dcd0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
dce0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69  ){.    if( p->di
dcf0: 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  rty ){.      p->
dd00: 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a  pDirty = pList;.
dd10: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b        pList = p;
dd20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
dd30: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
dd40: 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
dd50: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
dd60: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
dd70: 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
dd80: 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
dd90: 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
dda0: 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
ddb0: 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
ddc0: 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
ddd0: 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
dde0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77  ..**.** A _get w
ddf0: 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
de00: 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
de10: 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
de20: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
de30: 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
de40: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
de50: 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
de60: 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
de70: 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
de80: 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
de90: 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
dea0: 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
deb0: 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
dec0: 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
ded0: 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
dee0: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
def0: 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
df00: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
df10: 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
df20: 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
df30: 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
df40: 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
df50: 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
df60: 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
df70: 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
df80: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
df90: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
dfa0: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
dfb0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
dfc0: 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65  also sqlite3page
dfd0: 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  r_lookup().  Bot
dfe0: 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
dff0: 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74  nd _lookup() att
e000: 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
e010: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
e020: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
e030: 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
e040: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
e050: 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
e060: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
e070: 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
e080: 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f   it in whereas _
e090: 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  lookup().** just
e0a0: 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
e0b0: 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
e0c0: 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
e0d0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
e0e0: 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
e0f0: 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
e100: 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
e110: 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
e120: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
e130: 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e  ince _lookup() n
e140: 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
e150: 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
e160: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
e170: 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
e180: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
e190: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
e1a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
e1b0: 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
e1c0: 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64  *ppPage){.  PgHd
e1d0: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
e1e0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
e1f0: 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
e200: 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
e210: 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
e220: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
e230: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
e240: 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  no!=0 );.  *ppPa
e250: 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
e260: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
e270: 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
e280: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e290: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
e2a0: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
e2b0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
e2c0: 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
e2d0: 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
e2e0: 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
e2f0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
e300: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
e310: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
e320: 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65  0 && !pPager->me
e330: 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  mDb ){.    int b
e340: 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f 20  usy = 1;.    do 
e350: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
e360: 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
e370: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
e380: 4f 43 4b 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  OCK);.    }while
e390: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
e3a0: 59 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  Y && .        pP
e3b0: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
e3c0: 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  er && .        p
e3d0: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
e3e0: 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20  ler->xFunc && . 
e3f0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
e400: 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75  BusyHandler->xFu
e410: 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  nc(pPager->pBusy
e420: 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62  Handler->pArg, b
e430: 75 73 79 2b 2b 29 0a 20 20 20 20 29 3b 0a 20 20  usy++).    );.  
e440: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e450: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
e460: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
e470: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e480: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
e490: 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
e4a0: 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
e4b0: 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
e4c0: 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
e4d0: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
e4e0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
e4f0: 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
e500: 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
e510: 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
e520: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
e530: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
e540: 6c 20 26 26 20 0a 20 20 20 20 20 20 20 20 73 71  l && .        sq
e550: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
e560: 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
e570: 61 6c 29 20 26 26 0a 20 20 20 20 20 20 20 20 21  al) &&.        !
e580: 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
e590: 73 65 72 76 65 64 4c 6f 63 6b 28 26 70 50 61 67  servedLock(&pPag
e5a0: 65 72 2d 3e 66 64 29 20 0a 20 20 20 20 29 7b 0a  er->fd) .    ){.
e5b0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a         int rc;..
e5c0: 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e         /* Get an
e5d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
e5e0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e5f0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
e600: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
e610: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
e620: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
e630: 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
e640: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
e660: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
e670: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
e680: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
e690: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
e6a0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  CK;.         ret
e6b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d  urn rc;.       }
e6c0: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
e6d0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
e6e0: 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20  CLUSIVE;..      
e6f0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
e700: 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67  rnal for reading
e710: 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53   only.  Return S
e720: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20  QLITE_BUSY if.  
e730: 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
e740: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
e750: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
e760: 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  .       **.     
e770: 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    ** The journal
e780: 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e   file does not n
e790: 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
e7a0: 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20   itself.  The.  
e7b0: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
e7c0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
e7d0: 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
e7e0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
e7f0: 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a   holds.       **
e800: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
e810: 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
e820: 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
e830: 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
e840: 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f    ** processes o
e850: 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
e860: 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  al at the same t
e870: 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ime..       */. 
e880: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e890: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
e8a0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
e8b0: 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  l, &pPager->jfd)
e8c0: 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
e8d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e8e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
e8f0: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
e900: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
e910: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
e920: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
e930: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65  OCK;.         re
e940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
e950: 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
e960: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
e970: 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
e980: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
e990: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 0a 20  lStarted = 0;.. 
e9a0: 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
e9b0: 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
e9c0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
e9d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
e9e0: 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  te.       ** loc
e9f0: 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
ea00: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
ea10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ea20: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
ea30: 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
ea40: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
ea50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ea60: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ea70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
ea80: 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
ea90: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  lse{.    /* Sear
eaa0: 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63  ch for page in c
eab0: 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  ache */.    pPg 
eac0: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
ead0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
eae0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
eaf0: 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 73  mDb && pPager->s
eb00: 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
eb10: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
eb20: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
eb30: 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
eb40: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
eb50: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
eb60: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
eb70: 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65   not in the page
eb80: 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69   cache. */.    i
eb90: 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72  nt h;.    pPager
eba0: 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69  ->nMiss++;.    i
ebb0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
ebc0: 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20  <pPager->mxPage 
ebd0: 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  || pPager->pFirs
ebe0: 74 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  t==0 || pPager->
ebf0: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 2f  memDb ){.      /
ec00: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
ec10: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  age */.      pPg
ec20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
ec30: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29  aw( sizeof(*pPg)
ec40: 20 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53   + SQLITE_PAGE_S
ec50: 49 5a 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  IZE .           
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
ec80: 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
ec90: 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 2b 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 2a  + pPager->memDb*
ecc0: 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
ecd0: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
ece0: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
ecf0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
ed00: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mDb ){.         
ed10: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
ed20: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
ed30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
ed40: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
ed50: 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a   PAGER_ERR_MEM;.
ed60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
ed70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ed80: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
ed90: 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pPg, 0, sizeof
eda0: 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69  (*pPg));.      i
edb0: 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
edc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
edd0: 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  et(PGHDR_TO_HIST
ede0: 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
edf0: 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  , sizeof(PgHisto
ee00: 72 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ry));.      }.  
ee10: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
ee20: 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20  = pPager;.      
ee30: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  pPg->pNextAll = 
ee40: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
ee50: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c      pPager->pAll
ee60: 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50   = pPg;.      pP
ee70: 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20  ager->nPage++;. 
ee80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee90: 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
eea0: 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
eeb0: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
eec0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
eed0: 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20       ** require 
eee0: 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
eef0: 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
ef00: 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
ef10: 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
ef20: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
ef30: 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
ef40: 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
ef50: 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
ef60: 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
ef70: 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f  ync().      ** o
ef80: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
ef90: 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68  le then fsync th
efa0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
efb0: 20 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20   This is a.     
efc0: 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
efd0: 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
efe0: 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
eff0: 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
f000: 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74  imes.      ** it
f010: 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
f020: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f030: 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
f040: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
f050: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
f060: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
f070: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
f080: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
f090: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
f0a0: 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
f0b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
f0c0: 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ERR;.        }. 
f0d0: 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61         pPg = pPa
f0e0: 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20  ger->pFirst;.   
f0f0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
f100: 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  t( pPg->nRef==0 
f110: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  );..      /* Wri
f120: 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  te the page to t
f130: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f140: 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e   if it is dirty.
f150: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f160: 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
f170: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f180: 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
f190: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
f1a0: 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
f1b0: 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
f1c0: 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
f1d0: 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ( pPg );.       
f1e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f1f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f200: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
f210: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
f220: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
f230: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
f240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f250: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
f260: 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
f270: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f280: 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
f290: 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
f2a0: 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
f2b0: 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  k, then.      **
f2c0: 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20   set the global 
f2d0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
f2e0: 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c  lag, thus disabl
f2f0: 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ing the.      **
f300: 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c   sqlite_dont_rol
f310: 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61  lback() optimiza
f320: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73  tion for the res
f330: 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
f340: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  ction..      ** 
f350: 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  It is necessary 
f360: 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75  to do this becau
f370: 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b  se the page mark
f380: 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
f390: 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74  k.      ** might
f3a0: 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
f3b0: 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
f3c0: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
f3d0: 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
f3e0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69  .      ** that i
f3f0: 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77  s was marked alw
f400: 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  aysRollback.  Th
f410: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c  is means that al
f420: 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20  l pages must.   
f430: 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
f440: 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
f450: 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f  k from here on o
f460: 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ut..      */.   
f470: 20 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61     if( pPg->alwa
f480: 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
f490: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c        pPager->al
f4a0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
f4b0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
f4c0: 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f   /* Unlink the o
f4d0: 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ld page from the
f4e0: 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74   free list and t
f4f0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20  he hash table.  
f500: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c      */.      unl
f510: 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
f520: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66      pPager->nOvf
f530: 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  l++;.    }.    p
f540: 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
f550: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
f560: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  >aInJournal && (
f570: 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
f580: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
f590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
f5a0: 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  ckMemory(pPager-
f5b0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >aInJournal, pgn
f5c0: 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65  o/8);.      asse
f5d0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f5e0: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
f5f0: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
f600: 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  = (pPager->aInJo
f610: 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
f620: 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
f630: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
f640: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
f650: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
f660: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
f670: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
f680: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
f690: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
f6a0: 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  aInStmt && (int)
f6b0: 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
f6c0: 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  mtSize.         
f6d0: 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e      && (pPager->
f6e0: 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20  aInStmt[pgno/8] 
f6f0: 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
f700: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67  !=0 ){.      pag
f710: 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
f720: 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  st(pPg);.    }el
f730: 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72  se{.      page_r
f740: 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f  emove_from_stmt_
f750: 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
f760: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
f770: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  = 0;.    pPg->nR
f780: 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49  ef = 1;.    REFI
f790: 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50  NFO(pPg);.    pP
f7a0: 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
f7b0: 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68    h = pager_hash
f7c0: 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d  (pgno);.    pPg-
f7d0: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
f7e0: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
f7f0: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
f800: 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  [h] = pPg;.    i
f810: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
f820: 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
f830: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
f840: 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  h->pPrevHash==0 
f850: 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  );.      pPg->pN
f860: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
f870: 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
f880: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
f890: 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
f8a0: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
f8b0: 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c  O_EXTRA(pPg), 0,
f8c0: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
f8d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f8e0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
f8f0: 20 29 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   ) sqlite3pager_
f900: 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
f910: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
f920: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
f930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61  .      sqlite3pa
f940: 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f  ger_unref(PGHDR_
f950: 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20  TO_DATA(pPg));. 
f960: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
f970: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
f980: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f9a0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
f9b0: 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20  int)pgno ){.    
f9c0: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
f9d0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
f9e0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
f9f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
fa00: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
fa10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
fa20: 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20  ->memDb==0 );.  
fa30: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
fa40: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
fa50: 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53  pgno-1)*(off_t)S
fa60: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
fa70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
fa80: 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67  ite3OsRead(&pPag
fa90: 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
faa0: 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49  _DATA(pPg), SQLI
fab0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
fac0: 20 20 20 20 20 54 52 41 43 45 32 28 22 46 45 54       TRACE2("FET
fad0: 43 48 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  CH page %d\n", p
fae0: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
faf0: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50   CODEC(pPager, P
fb00: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
fb10: 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
fb20: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
fb30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fb40: 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53       off_t fileS
fb50: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
fb60: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
fb70: 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26  ze(&pPager->fd,&
fb80: 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54  fileSize)!=SQLIT
fb90: 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
fba0: 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e      || fileSize>
fbb0: 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47  =pgno*SQLITE_PAG
fbc0: 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
fbd0: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
fbe0: 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f  _unref(PGHDR_TO_
fbf0: 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20  DATA(pPg));.    
fc00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fc10: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
fc20: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
fc30: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
fc40: 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50  Pg), 0, SQLITE_P
fc50: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
fc60: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
fc70: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
fc80: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
fc90: 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
fca0: 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
fcb0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b     pPager->nHit+
fcc0: 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28  +;.    page_ref(
fcd0: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
fce0: 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  age = PGHDR_TO_D
fcf0: 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ATA(pPg);.  retu
fd00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fd10: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
fd20: 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
fd30: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
fd40: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
fd50: 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
fd60: 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
fd70: 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
fd80: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
fd90: 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
fda0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
fdb0: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
fdc0: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67   also sqlite3pag
fdd0: 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64  er_get().  The d
fde0: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
fdf0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
fe00: 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67  * and sqlite3pag
fe10: 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61 74  er_get() is that
fe20: 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
fe30: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
fe40: 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
fe50: 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
fe60: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
fe70: 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
fe80: 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
fe90: 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
fea0: 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
feb0: 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
fec0: 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
fed0: 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
fee0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
fef0: 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  3pager_lookup(Pa
ff00: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
ff10: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
ff20: 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
ff30: 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
ff40: 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
ff50: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
ff60: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
ff70: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
ff80: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ff90: 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
ffa0: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
ffb0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
ffc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ffd0: 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
ffe0: 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
fff0: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
10000 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
10010 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
10020 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
10030 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
10040 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
10050 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
10060 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
10070 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
10080 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
10090 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
100a0 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
100b0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
100c0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
100d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
100e0 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
100f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
10100 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70  er_unref(void *p
10110 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
10120 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65  pPg;..  /* Decre
10130 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
10140 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  ce count for thi
10150 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50  s page.  */.  pP
10160 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
10170 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  R(pData);.  asse
10180 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
10190 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
101a0 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
101b0 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
101c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
101d0 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
101e0 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
101f0 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
10200 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
10210 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
10220 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
10230 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
10240 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
10250 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
10260 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
10270 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
10280 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
10290 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
102a0 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
102b0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
102c0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
102d0 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
102e0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
102f0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
10300 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10310 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
10320 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
10330 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
10340 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
10350 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
10360 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
10370 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
10380 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
10390 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
103a0 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
103b0 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
103c0 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50  ructor(pData, pP
103d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
103e0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
103f0 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   When all pages 
10400 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69  reach the freeli
10410 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61  st, drop the rea
10420 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20  d lock from.    
10430 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
10440 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
10450 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b   pPager->nRef--;
10460 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
10470 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a  ger->nRef>=0 );.
10480 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10490 6e 52 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67  nRef==0 && !pPag
104a0 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
104b0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
104c0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
104d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
104e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
104f0 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
10500 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
10510 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
10520 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
10530 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
10540 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
10550 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
10560 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10570 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
10580 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
10590 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
105a0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
105b0 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
105c0 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
105d0 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
105e0 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
105f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10600 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
10610 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
10620 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
10630 74 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  t( !pPager->memD
10640 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
10650 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
10660 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
10670 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10680 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
10690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
106a0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
106b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67   );.  sqlite3pag
106c0 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
106d0 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
106e0 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  aInJournal = sql
106f0 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
10700 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
10710 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
10720 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
10730 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55  {.    sqlite3OsU
10740 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
10750 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
10760 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
10770 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
10780 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
10790 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
107a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
107b0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50  OpenExclusive(pP
107c0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
107d0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61  &pPager->jfd,pPa
107e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
107f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10800 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
10810 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
10820 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
10830 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
10840 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
10850 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
10860 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
10870 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
10880 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
10890 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
108a0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
108b0 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  EN;.  }.  sqlite
108c0 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  3OsOpenDirectory
108d0 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
108e0 6f 72 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ory, &pPager->jf
108f0 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  d);.  pPager->jo
10900 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
10910 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10920 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70  Started = 0;.  p
10930 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
10940 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
10950 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
10960 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
10970 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  c = 0;.  if( pPa
10980 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
10990 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
109a0 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
109b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
109c0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
109d0 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
109e0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
109f0 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 68 65  /* Create the he
10a00 61 64 65 72 20 66 6f 72 20 74 68 65 20 6a 6f 75  ader for the jou
10a10 72 6e 61 6c 3a 0a 20 20 2a 2a 20 2d 20 38 20 62  rnal:.  ** - 8 b
10a20 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
10a30 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
10a40 66 6f 72 6d 61 74 2e 0a 20 20 2a 2a 20 2d 20 34  format..  ** - 4
10a50 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
10a60 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
10a70 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
10a80 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
10a90 20 20 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20    ** - 4 bytes: 
10aa0 4d 61 67 69 63 20 75 73 65 64 20 66 6f 72 20 70  Magic used for p
10ab0 61 67 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a 20  age checksums.. 
10ac0 20 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49   ** - 4 bytes: I
10ad0 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
10ae0 70 61 67 65 20 63 6f 75 6e 74 2e 0a 20 20 2a 2a  page count..  **
10af0 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
10b00 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 73 65  er of bytes rese
10b10 72 76 65 64 20 66 6f 72 20 6d 61 73 74 65 72 20  rved for master 
10b20 6a 6f 75 72 6e 61 6c 20 70 74 72 20 28 6e 4d 61  journal ptr (nMa
10b30 73 74 65 72 29 0a 20 20 2a 2a 20 2d 20 6e 4d 61  ster).  ** - nMa
10b40 73 74 65 72 20 62 79 74 65 73 3a 20 53 70 61 63  ster bytes: Spac
10b50 65 20 66 6f 72 20 61 20 6d 61 73 74 65 72 20 6a  e for a master j
10b60 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2e 0a  ournal pointer..
10b70 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
10b80 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
10b90 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10ba0 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
10bb0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
10bc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10bd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
10be0 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
10bf0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
10c00 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66  ->noSync ? 0xfff
10c10 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a  fffff : 0);.  }.
10c20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10c30 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
10c40 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  e3Randomness(siz
10c50 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
10c60 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
10c70 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20  >cksumInit);.   
10c80 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
10c90 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
10ca0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
10cb0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
10cc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10cd0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
10ce0 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
10cf0 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
10d00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
10d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10d20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
10d30 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
10d40 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72   pPager->nMaster
10d50 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
10d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10d70 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
10d80 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 32 34  &pPager->jfd, 24
10d90 20 2b 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74   + pPager->nMast
10da0 65 72 20 2d 20 31 29 3b 0a 20 20 20 20 72 63 20  er - 1);.    rc 
10db0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
10dc0 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  (&pPager->jfd, "
10dd0 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20  \000", 1);.  }. 
10de0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
10df0 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d  tAutoopen && rc=
10e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
10e20 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70  ger_stmt_begin(p
10e30 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
10e40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10e50 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
10e60 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
10e70 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
10e80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10e90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10ea0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
10eb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  }.  return rc;  
10ec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
10ed0 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
10ee0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
10ef0 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d   The lock is rem
10f00 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65  oved when.** the
10f10 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
10f20 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a  owing happen:.**
10f30 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
10f40 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69  pager_commit() i
10f50 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
10f60 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
10f70 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c  ollback() is cal
10f80 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
10f90 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
10fa0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
10fb0 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
10fc0 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c  r_unref() is cal
10fd0 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
10fe0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
10ff0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
11000 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  t parameter to t
11010 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
11020 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20   pointer to any 
11030 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65  open page of the
11040 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
11050 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e  e.  Nothing chan
11060 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61  ges about the pa
11070 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20  ge - it is used 
11080 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71  merely to.** acq
11090 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74  uire a pointer t
110a0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
110b0 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f  cture and as pro
110c0 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73  of that there is
110d0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65  .** already a re
110e0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
110f0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
11100 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
11110 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f  ter indicates ho
11120 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20  w much space in 
11130 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
11140 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72   for a.** master
11150 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61   journal file-na
11160 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  me at the start 
11170 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
11180 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65  hen it is create
11190 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e  d..**.** A journ
111a0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
111b0 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  d if this is not
111c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
111d0 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  e.  For temporar
111e0 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20  y.** files, the 
111f0 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  opening of the j
11200 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
11210 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
11220 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74  ere is an.** act
11230 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74  ual need to writ
11240 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
11250 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
11260 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
11270 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  dy reserved for 
11280 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f  writing, this ro
11290 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
112a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
112b0 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64  pager_begin(void
112c0 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 4d 61   *pData, int nMa
112d0 73 74 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ster){.  PgHdr *
112e0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
112f0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
11300 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
11310 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
11320 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11330 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
11340 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
11350 72 74 28 20 6e 4d 61 73 74 65 72 3e 3d 30 20 29  rt( nMaster>=0 )
11360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11370 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
11380 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
11390 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
113a0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
113b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
113c0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
113d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
113e0 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
113f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
11400 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
11410 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
11420 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
11430 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
11440 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11450 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20   int busy = 1;. 
11460 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
11470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11480 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
11490 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
114a0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
114b0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
114c0 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 50  && .          pP
114d0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
114e0 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  er && .         
114f0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
11500 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20  ndler->xFunc && 
11510 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
11520 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
11530 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70  >xFunc(pPager->p
11540 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72  BusyHandler->pAr
11550 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20  g, busy++).     
11560 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
11570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11580 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
11590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
115a0 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20  pPager->nMaster 
115b0 3d 20 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20  = nMaster;.     
115c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
115d0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
115e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
115f0 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
11600 20 20 20 20 20 54 52 41 43 45 33 28 22 54 52 41       TRACE3("TRA
11610 4e 53 41 43 54 49 4f 4e 20 25 64 20 6e 4d 61 73  NSACTION %d nMas
11620 74 65 72 3d 25 64 5c 6e 22 2c 20 70 50 61 67 65  ter=%d\n", pPage
11630 72 2d 3e 66 64 2e 68 2c 20 6e 4d 61 73 74 65 72  r->fd.h, nMaster
11640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
11650 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
11660 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
11670 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
11680 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
11690 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
116a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
116b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
116c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
116d0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
116e0 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
116f0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
11700 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
11710 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
11720 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
11730 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
11740 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
11750 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
11760 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
11770 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
11780 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
11790 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
117a0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
117b0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
117c0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
117d0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
117e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
117f0 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
11800 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
11810 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
11820 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
11830 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
11840 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
11850 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
11860 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
11870 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
11880 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
11890 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
118a0 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
118b0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
118c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
118d0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
118e0 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
118f0 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
11900 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
11910 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
11920 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
11930 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
11940 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
11950 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
11960 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
11970 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
11980 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
11990 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
119a0 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
119b0 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
119c0 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  commit() or sqli
119d0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
119e0 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
119f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
11a00 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20  ager_write(void 
11a10 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
11a20 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
11a30 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
11a40 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
11a50 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
11a60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11a70 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
11a80 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
11a90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
11aa0 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74  Mask ){ .    ret
11ab0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
11ac0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
11ad0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
11ae0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74  dOnly ){.    ret
11af0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
11b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
11b10 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
11b20 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
11b30 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
11b40 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
11b50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
11b60 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
11b70 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
11b80 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20  .  pPg->dirty = 
11b90 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  1;.  if( pPg->in
11ba0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d  Journal && (pPg-
11bb0 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65  >inStmt || pPage
11bc0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29  r->stmtInUse==0)
11bd0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11be0 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
11bf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11c00 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
11c10 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
11c20 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
11c30 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
11c40 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74   to be.  ** writ
11c50 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
11c60 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
11c70 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
11c80 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72   journal.  ** or
11c90 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
11ca0 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
11cb0 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
11cc0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
11cd0 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a   exists and.  **
11ce0 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
11cf0 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   does not..  */.
11d00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11d10 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
11d20 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20  NLOCK );.  rc = 
11d30 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67  sqlite3pager_beg
11d40 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20  in(pData, 0);.  
11d50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11d60 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
11d70 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
11d80 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
11d90 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
11da0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
11db0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
11dc0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
11dd0 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
11de0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
11df0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
11e00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11e10 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
11e20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
11e30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
11e40 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65   || !pPager->use
11e50 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61  Journal );.  pPa
11e60 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
11e70 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  = 1;..  /* The t
11e80 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
11e90 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
11ea0 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
11eb0 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a 2a 20  RVED or an.  ** 
11ec0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
11ed0 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
11ee0 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
11ef0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
11f00 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 74 72  e to.  ** the tr
11f10 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
11f20 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
11f30 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
11f40 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  */.  if( !pPg->i
11f50 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
11f60 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
11f70 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  || pPager->memDb
11f80 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e  ) ){.    if( (in
11f90 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
11fa0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
11fb0 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  e ){.      int s
11fc0 7a 50 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73  zPg;.      u32 s
11fd0 61 76 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20  aved;.      if( 
11fe0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
11ff0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
12000 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
12010 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
12020 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
12030 54 52 41 43 45 32 28 22 4a 4f 55 52 4e 41 4c 20  TRACE2("JOURNAL 
12040 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d  page %d\n", pPg-
12050 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
12060 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
12070 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Orig==0 );.     
12080 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20     pHist->pOrig 
12090 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
120a0 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  w( pPager->pageS
120b0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ize );.        i
120c0 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
120d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
120e0 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
120f0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
12100 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
12110 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
12120 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e   }.        pPg->
12130 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
12140 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12150 20 20 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20      u32 cksum = 
12160 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
12170 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
12180 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 73  Data);.        s
12190 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47  aved = *(u32*)PG
121a0 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
121b0 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  );.        store
121c0 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50  32bits(cksum, pP
121d0 67 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  g, SQLITE_PAGE_S
121e0 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  IZE);.        sz
121f0 50 67 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45  Pg = SQLITE_PAGE
12200 5f 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20 20 20  _SIZE+8;.       
12210 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67   store32bits(pPg
12220 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29  ->pgno, pPg, -4)
12230 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28  ;.        CODEC(
12240 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
12250 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
12260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12270 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
12280 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a  r->jfd, &((char*
12290 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50  )pData)[-4], szP
122a0 67 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  g);.        TRAC
122b0 45 33 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67 65  E3("JOURNAL page
122c0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
122d0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  n", pPg->pgno, p
122e0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
122f0 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61         CODEC(pPa
12300 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
12310 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20  >pgno, 0);.     
12320 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f     *(u32*)PGHDR_
12330 54 4f 5f 45 58 54 52 41 28 70 50 67 29 20 3d 20  TO_EXTRA(pPg) = 
12340 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69  saved;.        i
12350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
12370 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
12380 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
12390 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
123a0 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
123b0 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
123c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
123d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
123e0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
123f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12400 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
12410 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
12420 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
12430 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
12440 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
12450 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70  no&7);.        p
12460 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
12470 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
12480 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a          pPg->inJ
12490 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
124a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
124b0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
124c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
124d0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
124e0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
124f0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
12500 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
12510 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
12520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12530 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12540 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
12550 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = !pPager->journ
12560 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
12570 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
12580 20 20 20 20 54 52 41 43 45 33 28 22 41 50 50 45      TRACE3("APPE
12590 4e 44 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  ND page %d needS
125a0 79 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  ync=%d\n", pPg->
125b0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
125c0 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ync);.    }.    
125d0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
125e0 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  c ){.      pPage
125f0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
12600 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12610 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
12620 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
12630 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
12640 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a  s not in it,.  *
12650 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
12660 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
12670 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
12680 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
12690 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  at.  ** the stat
126a0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
126b0 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
126c0 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
126d0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
126e0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
126f0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
12700 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
12710 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12720 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
12730 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
12740 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
12750 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
12760 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
12770 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
12780 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
12790 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
127a0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  bSize );.    if(
127b0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
127c0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
127d0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
127e0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
127f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
12800 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
12810 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 48  t==0 );.      pH
12820 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c  ist->pStmt = sql
12830 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
12840 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
12850 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73  ;.      if( pHis
12860 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
12870 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
12880 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54  ->pStmt, PGHDR_T
12890 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
128a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
128b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
128c0 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE2("STMT-JOURN
128d0 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  AL page %d\n", p
128e0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  Pg->pgno);.    }
128f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72  else{.      stor
12900 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e  e32bits(pPg->pgn
12910 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20  o, pPg, -4);.   
12920 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
12930 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
12940 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 72 63 20  o, 7);.      rc 
12950 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
12960 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
12970 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34  ((char*)pData)-4
12980 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
12990 5a 45 2b 34 29 3b 0a 20 20 20 20 20 20 54 52 41  ZE+4);.      TRA
129a0 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE2("STMT-JOURNA
129b0 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  L page %d\n", pP
129c0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
129d0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
129e0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
129f0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
12a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12a10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
12a20 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
12a30 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ger);.        pP
12a40 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
12a50 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b   PAGER_ERR_FULL;
12a60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12a70 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
12a80 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
12a90 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ec++;.      asse
12aa0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
12ab0 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
12ac0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
12ad0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
12ae0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
12af0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
12b00 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
12b10 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  t(pPg);.  }..  /
12b20 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
12b30 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
12b40 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
12b50 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
12b60 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  <(int)pPg->pgno 
12b70 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
12b80 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
12b90 6f 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  o;.    if( !pPag
12ba0 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61  er->memDb && pPa
12bb0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
12bc0 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
12bd0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
12be0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
12bf0 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
12c00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12c10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
12c20 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
12c30 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
12c40 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
12c50 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
12c60 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
12c70 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
12c80 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
12c90 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
12ca0 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
12cb0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
12cc0 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
12cd0 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65  te3pager_iswrite
12ce0 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61  able(void *pData
12cf0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
12d00 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
12d10 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
12d20 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a   pPg->dirty;.}..
12d30 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
12d40 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
12d50 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
12d60 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
12d70 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
12d80 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
12d90 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76   sqlite3pager_ov
12da0 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
12db0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
12dc0 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
12dd0 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
12de0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
12df0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
12e00 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
12e10 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
12e20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12e30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12e40 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
12e50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
12e60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12e70 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c     memcpy(pPage,
12e80 20 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50   pData, SQLITE_P
12e90 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
12ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
12eb0 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
12ec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
12ee0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
12ef0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
12f00 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
12f10 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
12f20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
12f30 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70  ation on page "p
12f40 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65  gno" back to the
12f50 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
12f60 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
12f70 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
12f80 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
12f90 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
12fa0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
12fb0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
12fc0 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
12fd0 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
12fe0 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
12ff0 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
13000 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
13010 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
13020 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
13030 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
13040 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
13050 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
13060 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
13070 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
13080 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  * sqlite3pager_d
13090 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62  ont_rollback() b
130a0 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
130b0 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
130c0 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
130d0 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
130e0 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
130f0 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
13100 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
13110 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
13120 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
13130 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
13140 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
13150 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
13160 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70  alls to sqlite3p
13170 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
13180 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
13190 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
131a0 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
131b0 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
131c0 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
131d0 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
131e0 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
131f0 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
13200 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
13210 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
13220 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
13230 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
13240 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
13250 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
13260 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
13270 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
13280 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
13290 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
132a0 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
132b0 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
132c0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
132d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
132e0 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
132f0 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e  used,.** the don
13300 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  t_rollback() rou
13310 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
13320 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
13330 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a   page contains.*
13340 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  * critical data,
13350 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
13360 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
13370 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  s rolled back in
13380 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65   spite.** of the
13390 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
133a0 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   call..*/.void s
133b0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
133c0 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  _write(Pager *pP
133d0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
133e0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
133f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d  .  if( pPager->m
13400 65 6d 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 0a  emDb ) return;..
13410 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
13420 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
13430 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79  o);.  pPg->alway
13440 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
13450 20 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d   if( pPg && pPg-
13460 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66  >dirty ){.    if
13470 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
13480 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
13490 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
134a0 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
134b0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
134c0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
134d0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
134e0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
134f0 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
13500 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
13510 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
13520 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
13530 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
13540 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
13550 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
13560 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13570 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
13580 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
13590 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
135a0 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
135b0 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
135c0 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
135d0 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
135e0 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
135f0 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
13600 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
13610 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
13620 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
13630 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
13640 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
13650 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
13660 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
13670 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
13680 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
13690 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
136a0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
136b0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
136c0 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
136d0 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
136e0 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70  f %d\n", pgno, p
136f0 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
13700 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
13710 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
13720 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
13730 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
13740 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
13750 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
13760 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
13770 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
13780 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
13790 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
137a0 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
137b0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
137c0 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
137d0 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
137e0 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
137f0 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
13800 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ournal..*/.void 
13810 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
13820 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20  t_rollback(void 
13830 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
13840 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
13850 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
13860 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
13870 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
13880 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
13890 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e!=PAGER_EXCLUSI
138a0 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  VE || pPager->jo
138b0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72  urnalOpen==0 ) r
138c0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
138d0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
138e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61   || pPager->alwa
138f0 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
13900 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65  ager->memDb ) re
13910 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
13920 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
13930 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
13940 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
13950 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
13960 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
13970 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
13980 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
13990 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
139a0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
139b0 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
139c0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
139d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
139e0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
139f0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
13a00 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
13a10 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
13a20 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  ;.      page_add
13a30 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
13a40 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  g);.    }.    TR
13a50 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
13a60 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
13a70 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
13a80 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
13a90 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
13aa0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21  ->stmtInUse && !
13ab0 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28  pPg->inStmt && (
13ac0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
13ad0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
13ae0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13af0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
13b00 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
13b10 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
13b20 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
13b30 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
13b40 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  t!=0 );.    pPag
13b50 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
13b60 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
13b70 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
13b80 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
13b90 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
13ba0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  }.}.../*.** Clea
13bb0 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c  r a PgHistory bl
13bc0 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ock.*/.static vo
13bd0 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  id clearHistory(
13be0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
13bf0 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
13c00 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20  pHist->pOrig);. 
13c10 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
13c20 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69  t->pStmt);.  pHi
13c30 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20  st->pOrig = 0;. 
13c40 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
13c50 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  0;.}../*.** Comm
13c60 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
13c70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
13c80 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
13c90 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
13ca0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
13cb0 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
13cc0 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
13cd0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
13ce0 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
13cf0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13d00 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
13d10 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
13d20 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
13d30 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13d40 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61  3pager_commit(Pa
13d50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
13d60 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
13d70 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
13d80 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41  ger->errMask==PA
13d90 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
13da0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13db0 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
13dc0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
13dd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13de0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13df0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
13e00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13e10 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
13e20 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
13e30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
13e40 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
13e50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
13e60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
13e70 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
13e80 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
13e90 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13ea0 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f    }.  TRACE2("CO
13eb0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67  MMIT %d\n", pPag
13ec0 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28  er->fd.h);.  if(
13ed0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
13ee0 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
13ef0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
13f00 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
13f10 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
13f20 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
13f30 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
13f40 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
13f50 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
13f60 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
13f70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
13f80 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
13f90 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
13fa0 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
13fb0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
13fc0 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
13fd0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
13fe0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
13ff0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
14000 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
14010 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
14020 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
14030 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
14040 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
14050 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
14060 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
14070 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
14080 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
14090 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
140a0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
140b0 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
140c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
140d0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
140e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
140f0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
14100 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
14110 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
14120 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  f( pPager->dirty
14130 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Cache==0 ){.    
14140 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77  /* Exit early (w
14150 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65  ithout doing the
14160 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20   time-consuming 
14170 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
14180 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66  calls).    ** if
14190 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
141a0 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74   no changes to t
141b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
141c0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
141d0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
141e0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  c==0 );.    rc =
141f0 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
14200 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14210 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
14220 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
14230 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
14240 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14250 6c 4f 70 65 6e 20 29 3b 0a 23 69 66 20 30 0a 20  lOpen );.#if 0. 
14260 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
14270 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  l(pPager, 0);.  
14280 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14290 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f  K ){.    goto co
142a0 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a  mmit_abort;.  }.
142b0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
142c0 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
142d0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  s(pPager);.  if(
142e0 20 70 50 67 20 29 7b 0a 20 20 20 20 72 63 20 3d   pPg ){.    rc =
142f0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
14300 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
14310 69 66 28 20 72 63 20 7c 7c 20 28 21 70 50 61 67  if( rc || (!pPag
14320 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71  er->noSync && sq
14330 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61  lite3OsSync(&pPa
14340 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45  ger->fd)!=SQLITE
14350 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  _OK) ){.      go
14360 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
14370 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
14380 66 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  f.  rc = sqlite3
14390 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65  pager_sync(pPage
143a0 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  r, 0);.  if( rc!
143b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
143c0 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
143d0 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ort;.  }.  rc = 
143e0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
143f0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  k(pPager);.  pPa
14400 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
14410 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
14420 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
14430 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
14440 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65  wrong during the
14450 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
14460 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f  .  */.commit_abo
14470 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rt:.  rc = sqlit
14480 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
14490 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
144a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
144b0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
144c0 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74  _FULL;.  }.  ret
144d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
144e0 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
144f0 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
14500 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
14510 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
14520 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
14530 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
14540 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
14550 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
14560 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
14570 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
14580 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
14590 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
145a0 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
145b0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
145c0 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
145d0 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
145e0 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
145f0 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  (SQLITE_PROTOCOL
14600 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65  ) or unless some
14610 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
14620 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61  s is writing tra
14630 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  sh into the jour
14640 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45  nal file (SQLITE
14650 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20  _CORRUPT) or.** 
14660 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d  unless a prior m
14670 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28  alloc() failed (
14680 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20  SQLITE_NOMEM).  
14690 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  Appropriate erro
146a0 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72  r.** codes are r
146b0 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20  eturned for all 
146c0 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e  these occasions.
146d0 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
146e0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
146f0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
14700 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
14710 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
14720 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
14730 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b  TRACE2("ROLLBACK
14740 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
14750 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61  fd.h);.  if( pPa
14760 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
14770 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
14780 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
14790 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
147a0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
147b0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
147c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
147d0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
147e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
147f0 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
14800 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
14810 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
14820 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
14830 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
14840 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
14850 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
14860 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
14870 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
14880 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
14890 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
148a0 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
148b0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
148c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
148d0 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
148e0 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
148f0 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
14900 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
14910 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
14920 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22 52         TRACE2("R
14930 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 5c  OLLBACK-PAGE %d\
14940 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20  n", p->pgno);.  
14950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14960 20 20 20 54 52 41 43 45 32 28 22 50 41 47 45 20     TRACE2("PAGE 
14970 25 64 20 69 73 20 63 6c 65 61 6e 5c 6e 22 2c 20  %d is clean\n", 
14980 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  p->pgno);.      
14990 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  }.      clearHis
149a0 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
149b0 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
149c0 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72  .      p->inJour
149d0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
149e0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
149f0 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74      p->pPrevStmt
14a00 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20   = p->pNextStmt 
14a10 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
14a20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
14a30 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
14a40 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50  ger->xReiniter(P
14a50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
14a60 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
14a70 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
14a80 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61    .    }.    pPa
14a90 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
14aa0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
14ab0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  ze = pPager->ori
14ac0 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d  gDbSize;.    mem
14ad0 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
14ae0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
14af0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
14b00 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
14b10 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
14b20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
14b30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
14b40 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
14b50 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
14b60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
14b70 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
14b80 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
14b90 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
14ba0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
14bb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14bc0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
14bd0 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70  >errMask!=0 && p
14be0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
14bf0 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29  PAGER_ERR_FULL )
14c00 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
14c10 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
14c20 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
14c30 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
14c40 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
14c50 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61   }.    return pa
14c60 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
14c70 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
14c80 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
14c90 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
14ca0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
14cb0 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f   rc = pager_relo
14cc0 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
14cd0 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  ;.    rc2 = page
14ce0 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
14cf0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
14d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14d10 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
14d20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
14d30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
14d40 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
14d50 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
14d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14d70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
14d80 52 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65  RRUPT;.    pPage
14d90 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
14da0 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b  GER_ERR_CORRUPT;
14db0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
14dc0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65  bSize = -1;.  re
14dd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14de0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
14df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14e00 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
14e10 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
14e20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
14e30 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
14e40 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
14e50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14e60 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79  pager_isreadonly
14e70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14e80 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
14e90 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
14ea0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14eb0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
14ec0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
14ed0 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
14ee0 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74  *sqlite3pager_st
14ef0 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
14f00 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
14f10 20 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20   a[9];.  a[0] = 
14f20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
14f30 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
14f40 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
14f50 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
14f60 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
14f70 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
14f80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
14f90 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
14fa0 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d  >errMask;.  a[6]
14fb0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
14fc0 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
14fd0 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
14fe0 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b  = pPager->nOvfl;
14ff0 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a  .  return a;.}..
15000 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74  /*.** Set the st
15010 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
15020 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   point..**.** Th
15030 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
15040 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
15050 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15060 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
15070 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
15080 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
15090 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
150a0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
150b0 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
150c0 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
150d0 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69  e SQL command wi
150e0 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72  thin a larger tr
150f0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
15100 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
15110 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20  tmt_begin(Pager 
15120 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
15130 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  rc;.  char zTemp
15140 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
15150 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74  _SIZE];.  assert
15160 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  ( !pPager->stmtI
15170 6e 55 73 65 20 29 3b 0a 20 20 54 52 41 43 45 32  nUse );.  TRACE2
15180 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
15190 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
151a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
151b0 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50  >memDb ){.    pP
151c0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
151d0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
151e0 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
151f0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
15200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15210 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
15220 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
15230 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
15240 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
15250 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15260 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
15270 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
15280 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
15290 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
152a0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
152b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
152c0 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
152d0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20  ger->aInStmt==0 
152e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
152f0 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
15300 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
15310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15320 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66  E_NOMEM;.  }.#if
15330 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63  ndef NDEBUG.  rc
15340 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15350 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
15360 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74  d, &pPager->stmt
15370 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
15380 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
15390 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73  in_failed;.  ass
153a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
153b0 74 4a 53 69 7a 65 20 3d 3d 20 0a 20 20 20 20 70  tJSize == .    p
153c0 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52  Pager->nRec*JOUR
153d0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
153e0 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) + JOURNAL_HDR_
153f0 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 23 65  SZ(pPager) );.#e
15400 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73  ndif.  pPager->s
15410 74 6d 74 4a 53 69 7a 65 20 3d 0a 20 20 20 20 20  tmtJSize =.     
15420 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55  pPager->nRec*JOU
15430 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
15440 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  r) + JOURNAL_HDR
15450 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 70  _SZ(pPager);.  p
15460 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
15470 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
15480 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
15490 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
154a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
154b0 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
154c0 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64  p, &pPager->stfd
154d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
154e0 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
154f0 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67  failed;.    pPag
15500 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
15510 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
15520 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
15530 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
15540 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
15550 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
15560 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
15570 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
15580 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  aInStmt ){.    s
15590 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
155a0 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->aInStmt);.    
155b0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
155c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
155d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
155e0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
155f0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
15600 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
15610 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
15620 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15630 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
15640 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
15650 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32  Next;.    TRACE2
15660 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
15670 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
15680 68 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  h);.    if( !pPa
15690 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
156a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
156b0 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  k(&pPager->stfd,
156c0 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71   0);.      /* sq
156d0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
156e0 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  &pPager->stfd, 0
156f0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
15700 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
15710 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  aInStmt );.     
15720 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
15730 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
15740 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
15750 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
15760 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e  pNext){.      pN
15770 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
15780 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Stmt;.      asse
15790 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  rt( pPg->inStmt 
157a0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
157b0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
157c0 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
157d0 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
157e0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
157f0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
15800 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
15810 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
15820 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
15830 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73  ager);.        s
15840 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
15850 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
15860 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
15870 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
15880 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
15890 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
158a0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
158b0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
158c0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  ->pStmt = 0;.  }
158d0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
158e0 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
158f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
15910 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ck a statement..
15920 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
15930 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63  ger_stmt_rollbac
15940 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
15950 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
15960 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
15970 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45  Use ){.    TRACE
15980 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b  2("STMT-ROLLBACK
15990 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
159a0 66 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20 70  fd.h);.    if( p
159b0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
159c0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
159d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
159e0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
159f0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
15a00 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
15a10 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
15a20 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
15a30 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
15a40 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
15a50 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
15a60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
15a70 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
15a80 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
15a90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
15aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15ab0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
15ac0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
15ad0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
15ae0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15af0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
15b00 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
15b10 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20  r->stmtSize;.   
15b20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
15b30 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
15b40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15b50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15b60 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
15b70 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
15b80 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
15b90 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
15ba0 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  commit(pPager);.
15bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
15bc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
15bd0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
15be0 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
15bf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15c00 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
15c10 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
15c20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15c30 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
15c40 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69  *sqlite3pager_fi
15c50 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
15c60 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
15c70 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
15c80 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
15c90 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
15ca0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15cb0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
15cc0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
15cd0 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72  er_dirname(Pager
15ce0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
15cf0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
15d00 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
15d10 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
15d20 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
15d30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
15d40 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
15d50 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e  lite3pager_journ
15d60 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
15d70 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
15d80 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
15d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
15da0 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
15db0 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
15dc0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
15dd0 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  _codec(.  Pager 
15de0 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
15df0 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
15e00 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
15e10 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
15e20 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
15e30 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
15e40 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
15e50 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
15e60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
15e70 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
15e80 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
15e90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15ea0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
15eb0 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
15ec0 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
15ed0 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
15ee0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
15ef0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
15f00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15f10 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
15f20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
15f30 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
15f40 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nter;.  int rc;.
15f50 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20  .  /* Open page 
15f60 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
15f70 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
15f80 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
15f90 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c  r_get(pPager, 1,
15fa0 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
15fb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
15fc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
15fd0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
15fe0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69  rite(pPage);.  i
15ff0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16000 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
16010 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72   /* Read the cur
16020 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79  rent value at by
16030 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48  te 24. */.  pPgH
16040 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  dr = DATA_TO_PGH
16050 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61  DR(pPage);.  cha
16060 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65  nge_counter = re
16070 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
16080 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20  Hdr, 24);..  /* 
16090 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
160a0 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
160b0 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
160c0 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
160d0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
160e0 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73  +;.  store32bits
160f0 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c  (change_counter,
16100 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20   pPgHdr, 24);.. 
16110 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
16120 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
16130 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  */.  sqlite3page
16140 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
16150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16160 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
16170 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
16180 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
16190 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
161a0 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
161b0 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
161c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
161d0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
161e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
161f0 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
16200 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
16210 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
16220 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
16230 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
16240 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
16250 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
16260 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
16270 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16280 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
16290 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
162a0 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
162b0 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
162c0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
162d0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
162e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
162f0 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
16300 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
16310 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
16320 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
16330 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
16340 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
16350 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
16360 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
16370 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
16380 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
16390 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
163a0 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
163b0 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
163c0 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
163d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
163e0 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e  nc() call..*/.in
163f0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
16400 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
16410 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
16420 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
16430 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
16440 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16450 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
16460 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
16470 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
16480 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20  o, or this.  ** 
16490 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
164a0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
164b0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
164c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
164d0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
164e0 5f 53 59 4e 43 45 44 20 26 26 20 21 70 50 61 67  _SYNCED && !pPag
164f0 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61  er->memDb && pPa
16500 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
16510 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
16520 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
16530 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
16540 65 6e 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  en );..    rc = 
16550 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
16560 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
16570 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16580 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
16590 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  ync_exit;..    /
165a0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
165b0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  al file */.    r
165c0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
165d0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
165e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
165f0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
16600 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  ync_exit;..    /
16610 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
16620 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
16630 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
16640 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
16650 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
16660 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
16670 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
16680 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
16690 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
166a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
166b0 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
166c0 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
166d0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
166e0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
166f0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
16700 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
16710 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
16720 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d    }..    pPager-
16730 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
16740 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63  YNCED;.  }..sync
16750 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20  _exit:.  return 
16760 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
16770 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
16780 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
16790 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
167a0 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
167b0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
167c0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
167d0 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
167e0 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
167f0 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
16800 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
16810 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
16820 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
16830 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
16840 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
16850 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
16860 61 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70  ager->fd.locktyp
16870 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  e;.}.#endif..#if
16880 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16890 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
168a0 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
168b0 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
168c0 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
168d0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
168e0 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28  e3pager_refdump(
168f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
16900 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
16910 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
16920 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
16930 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
16940 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
16950 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
16960 20 20 20 20 70 72 69 6e 74 66 28 22 50 41 47 45      printf("PAGE
16970 20 25 33 64 20 61 64 64 72 3d 30 78 25 30 38 78   %3d addr=0x%08x
16980 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
16990 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
169a0 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41  (int)PGHDR_TO_DA
169b0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
169c0 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
169d0 66 0a                                            f.